?
/*
************************************************
?*???????????????????????????????????????????????*
?*??Module:?tokenvalue.h?????????????????????????*
?*??Description:?????????????????????????????????*
?*??????Defines?the?Tokenvalue?union.????????????*
?*??Author:?Van?Oostenrijk,?A.C.?????????????????*
?*??Modifications:???????????????????????????????*
?*???????????????????????????????????????????????*
?*************************************************
?*???????????????????????????????????????????????*
?*???This?program?is?free?software;?you?can??????*
?*???redistribute?it?and/or?modify??it?under?????*
?*???the?terms?of?the?GNU?General?Public?????????*
?*???License?as?published?by?the?Free????????????*
?*???Software?Foundation;?either?version?2???????*
?*???of?the?License,?or?(at?your?option)?any?????*
?*???later?version.??????????????????????????????*
?*???????????????????????????????????????????????*
?************************************************
*/
#ifndef?TOKENVALUE_H
#define
?TOKENVALUE_H
#include?
"
defs.h
"
//
使用一個(gè)union來處理各種數(shù)據(jù)
typedef?union
{
????unsigned?
long
??uintvalue;
????BOOL????boolvalue;
????
char
???
*
stringvalue;
????
char
????charvalue;
????
float
???floatvalue;
????
char
???
*
identifier;
}?Tokenvalue;
//
將Tokenvalue轉(zhuǎn)化為字符串
char
?
*
TokenvalueToString(?
int
?node,?Tokenvalue?tokenvalue?);
#endif
?
TokenvalueToString具體實(shí)現(xiàn):
/*
************************************************
?*???????????????????????????????????????????????*
?*??Module:?tokenvalue.c?????????????????????????*
?*??Description:?????????????????????????????????*
?*??????Converts?token?values?to?strings.????????*
?*??Author:?Van?Oostenrijk,?A.C.?????????????????*
?*??Modifications:???????????????????????????????*
?*??????JWH:?Added?NODE_CASE?to?the??????????????*
?*??????TokenvalueToString?function??????????????*
?*???????????????????????????????????????????????*
?*************************************************
?*???????????????????????????????????????????????*
?*???This?program?is?free?software;?you?can??????*
?*???redistribute?it?and/or?modify??it?under?????*
?*???the?terms?of?the?GNU?General?Public?????????*
?*???License?as?published?by?the?Free????????????*
?*???Software?Foundation;?either?version?2???????*
?*???of?the?License,?or?(at?your?option)?any?????*
?*???later?version.??????????????????????????????*
?*???????????????????????????????????????????????*
?************************************************
*/
#include?
"
tokenvalue.h
"
#include?
"
nodenames.h
"
char
?
*
TokenvalueToString(?
int
?node,?Tokenvalue?tokenvalue?)
{
????
static
?
char
?value[
100
];
????
switch
(?node?)
????{
????
case
?NODE_LIT_INT:
????
case
?NODE_CASE:
????????sprintf(?value,?
"
%ld
"
,?tokenvalue.uintvalue?);
????????
break
;
????
case
?NODE_LIT_BOOL:
????????sprintf(?value,?
"
%s
"
,?tokenvalue.boolvalue?
==
?TRUE?
?
?
"
true
"
?:?
"
false
"
?);
????????
break
;
????
case
?NODE_LIT_CHAR:
????????sprintf(?value,?
"
'%c'
"
,?tokenvalue.charvalue?);
????????
break
;?
????
case
?NODE_LIT_STRING:
????????sprintf(?value,?
"
\
"
%
s\
""
,?tokenvalue.stringvalue?);
????????
break
;
????
case
?NODE_LIT_FLOAT:
????????sprintf(?value,?
"
%f
"
,?tokenvalue.floatvalue?);
????????
break
;
????
case
?NODE_LIT_IDENTIFIER:
????????sprintf(?value,?
"
%s
"
,?tokenvalue.identifier?);
????????
break
;
????
case
?NODE_REFERENCE:
????????sprintf(?value,?
"
%ld
"
,?tokenvalue.uintvalue?);
????????
break
;
????
case
?NODE_DIMENSIONBLOCK:
????????sprintf(?value,?
"
%ld
"
,?tokenvalue.uintvalue?);
????????
break
;
????
case
?NODE_INDEX:
????????sprintf(?value,?
"
%ld
"
,?tokenvalue.uintvalue?);
????????
break
;
????
default
:
????????sprintf(?value,?
"
?
"
?);
????}
????
return
(?value?);
}
inger支持的所有關(guān)鍵字和操作符:
/*************************************************
?*???????????????????????????????????????????????*
?*??Module:?tokens.h?????????????????????????????*
?*??Description:?????????????????????????????????*
?*??????Contains?token?definitions.??????????????*
?*??Author:?Van?Oostenrijk,?A.C.?????????????????*
?*??Modifications:???????????????????????????????*
?*??AO:?Rearranged?keywords?in?alphabetic????????*
?*??????fashion.?????????????????????????????????*
?*??AO:?Keyword?'then'?removed.??????????????????*
?*??AO:?Renamed?QUESTIONMARK?to?OP_TERNARY_IF.???*
?*??AO:?Renamed?PARENTHESIS_LEFT?to?LPAREN.??????*
?*??AO:?Renamed?PARENTHESIS_RIGHT?to?RPAREN.?????*
?*??AO:?Renamed?BRACKET_LEFT?to?LBRACKET.????????*
?*??AO:?Renamed?BRACKET_RIGHT?to?RBRACKET.???????*
?*??AO:?Renamed?BLOCK_START?to?LBRACE.???????????*
?*??AO:?Renamed?BLOCK_END?to?RBRACE.?????????????*
?*??AO:?Keyword?'extern'?added.??????????????????*
?*??JWH:?Renamed?"parser.h"?to?"tokens.h"????????*
?*???????????????????????????????????????????????*
?*************************************************
?*???????????????????????????????????????????????*
?*???This?program?is?free?software;?you?can??????*
?*???redistribute?it?and/or?modify??it?under?????*
?*???the?terms?of?the?GNU?General?Public?????????*
?*???License?as?published?by?the?Free????????????*
?*???Software?Foundation;?either?version?2???????*
?*???of?the?License,?or?(at?your?option)?any?????*
?*???later?version.??????????????????????????????*
?*???????????????????????????????????????????????*
?*************************************************/
/*!TOKENSH*/
#ifndef?TOKENS_H
#define?TOKENS_H
#include?"defs.h"
/*?#include?"type.h"?*/
#include?"tokenvalue.h"
#include?"ast.h"
/*
?*
?*??MACROS?
?*
?*/
/*?Define?where?a?line?starts?(at?position?1)
?*/
#define?LINECOUNTBASE?1
/*?Define?the?position?of?a?first?character?of?a?line.
?*/
#define?CHARPOSBASE?1
/*?Define?the?block?size?with?which?strings?are?allocated.
?*/
#define?STRING_BLOCK?100?
/*
?*
?*??TYPES
?*
?*/
/*?This?enum?contains?all?the?keywords?and?operators
?*?used?in?the?language.
?*/
enum
{
????/*?Keywords?*/
????KW_BREAK????????????=?1000,?/*?"break"?keyword?*/
????KW_CASE,????????????????????/*?"case"?keyword?*/
????KW_CONTINUE,????????????????/*?"continue"?keyword?*/
????KW_DEFAULT,?????????????????/*?"default"?keyword?*/
????KW_DO,??????????????????????/*?"do"?keyword?*/
????KW_ELSE,????????????????????/*?"else"?keyword?*/
????KW_EXTERN,??????????????????/*?"extern"?keyword?*/
????KW_GOTO,????????????????????/*?"goto"?keyword?*/
????KW_IF,??????????????????????/*?"if"?keyword?*/
????KW_LABEL,???????????????????/*?"label"?keyword?*/
????KW_MODULE,??????????????????/*?"module"?keyword?*/
????KW_RETURN,??????????????????/*?"return"keyword?*/
????KW_START,???????????????????/*?"start"?keyword?*/
????KW_SWITCH,??????????????????/*?"switch"?keyword?*/
????KW_WHILE,???????????????????/*?"while"?keyword?*/
????/*?Type?identifiers?*/
????KW_BOOL,????????????????????/*?"bool"?identifier?*/
????KW_CHAR,????????????????????/*?"char"?identifier?*/
????KW_FLOAT,???????????????????/*?"float"?identifier?*/
????KW_INT,?????????????????????/*?"int"?identifier?*/
????KW_UNTYPED,?????????????????/*?"untyped"?identifier?*/
????KW_VOID,????????????????????/*?"void"?identifier?*/
????/*?Variable?lexer?tokens?*/
????LIT_BOOL,???????????????????/*?bool?constant?*/
????LIT_CHAR,???????????????????/*?character?constant?*/
????LIT_FLOAT,??????????????????/*?floating?point?constant?*/
????LIT_INT,????????????????????/*?integer?constant?*/
????LIT_STRING,?????????????????/*?string?constant?*/
????IDENTIFIER,?????????????????/*?identifier?*/
????/*?Operators?*/
????OP_ADD,?????????????????????/*?"+"??*/
????OP_ASSIGN,??????????????????/*?"="??*/
????OP_BITWISE_AND,?????????????/*?"&"?*/
????OP_BITWISE_COMPLEMENT,??????/*?"~"??*/
????OP_BITWISE_LSHIFT,??????????/*?"<<"?*/
????OP_BITWISE_OR,??????????????/*?"|"?*/
????OP_BITWISE_RSHIFT,??????????/*?">>"?*/
????OP_BITWISE_XOR,?????????????/*?"^"??*/
????OP_DIVIDE,??????????????????/*?"/"??*/
????OP_EQUAL,???????????????????/*?"=="?*/
????OP_GREATER,?????????????????/*?">"??*/
????OP_GREATEREQUAL,????????????/*?">="?*/
????OP_LESS,????????????????????/*?"<"??*/
????OP_LESSEQUAL,???????????????/*?"<="?*/
????OP_LOGICAL_AND,?????????????/*?"&&"?*/
????OP_LOGICAL_OR,??????????????/*?"||"?*/
????OP_MODULUS,?????????????????/*?"%"??*/
????OP_MULTIPLY,????????????????/*?"*"??*/
????OP_NOT,?????????????????????/*?"!"??*/
????OP_NOTEQUAL,????????????????/*?"!="?*/
????OP_SUBTRACT,????????????????/*?"-"??*/
????OP_TERNARY_IF,??????????????/*?"?"??*/
???
????/*?Delimiters?*/
????ARROW,??????????????????????/*?"->"?*/
????LBRACE,?????????????????????/*?"{"??*/
????RBRACE,?????????????????????/*?"}"??*/
????LBRACKET,???????????????????/*?"["??*/
????RBRACKET,???????????????????/*?"]"??*/
????COLON,??????????????????????/*?":"??*/
????COMMA,??????????????????????/*?","??*/
????LPAREN,?????????????????????/*?"("??*/
????RPAREN,?????????????????????/*?")"??*/
????SEMICOLON???????????????????/*?";"??*/
}
tokens;
?
/*
?*
?*??FUNCTION?DECLARATIONS
?*
?*/
TreeNode?*Parse();
/*
?*
?*??GLOBALS
?*
?*/
extern?Tokenvalue?tokenvalue;
#endif
/*!*/