添加双字符符号的解析
This commit is contained in:
4
main.c
4
main.c
@@ -13,8 +13,8 @@
|
|||||||
|
|
||||||
|
|
||||||
const char g_str[ ] = "int main(){\n"
|
const char g_str[ ] = "int main(){\n"
|
||||||
"int index;\n"
|
"int index=1000;\n"
|
||||||
"while(1){\n"
|
"while(index--){\n"
|
||||||
"printf(index)\n"
|
"printf(index)\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
"}";
|
"}";
|
||||||
|
@@ -23,7 +23,17 @@ typedef enum {
|
|||||||
TOKEN_INT=263,
|
TOKEN_INT=263,
|
||||||
TOKEN_VOID=264,
|
TOKEN_VOID=264,
|
||||||
TOKEN_NAME = 265 ,
|
TOKEN_NAME = 265 ,
|
||||||
TOKEN_NUM = 266 ,
|
TOKEN_NUM = 266 ,// 数字
|
||||||
|
TOKEN_INC = 267,// 自增
|
||||||
|
TOKEN_DEC = 268,// 自减
|
||||||
|
TOKEN_EQ = 269,// 相等
|
||||||
|
TOKEN_NEQ = 270,// 不相等
|
||||||
|
TOKEN_LSH = 271,// 左移
|
||||||
|
TOKEN_RSH = 272,// 右移
|
||||||
|
TOKEN_LEQ = 273,// 小于等于
|
||||||
|
TOKEN_GEQ = 274,// 大于等于
|
||||||
|
TOKEN_ELSE = 275,
|
||||||
|
TOKEN_CONTINUE = 276,
|
||||||
}token_index_def;
|
}token_index_def;
|
||||||
|
|
||||||
|
|
||||||
@@ -37,6 +47,7 @@ typedef struct {
|
|||||||
|
|
||||||
const keywork_item_def g_keyword_table[ ] = {
|
const keywork_item_def g_keyword_table[ ] = {
|
||||||
TOKEN_DEF(if,TOKEN_IF),
|
TOKEN_DEF(if,TOKEN_IF),
|
||||||
|
TOKEN_DEF(else,TOKEN_ELSE),
|
||||||
TOKEN_DEF(break,TOKEN_IF),
|
TOKEN_DEF(break,TOKEN_IF),
|
||||||
TOKEN_DEF(while,TOKEN_WHILE),
|
TOKEN_DEF(while,TOKEN_WHILE),
|
||||||
TOKEN_DEF(switch,TOKEN_SWITCH),
|
TOKEN_DEF(switch,TOKEN_SWITCH),
|
||||||
@@ -45,7 +56,8 @@ const keywork_item_def g_keyword_table[ ] = {
|
|||||||
TOKEN_DEF(char,TOKEN_CHAR),
|
TOKEN_DEF(char,TOKEN_CHAR),
|
||||||
TOKEN_DEF(int,TOKEN_INT),
|
TOKEN_DEF(int,TOKEN_INT),
|
||||||
TOKEN_DEF(void,TOKEN_VOID),
|
TOKEN_DEF(void,TOKEN_VOID),
|
||||||
{NULL } ,
|
TOKEN_DEF(continue,TOKEN_CONTINUE),
|
||||||
|
{NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -242,12 +254,10 @@ int lex_analysis(const char *text,int len){
|
|||||||
case '[':
|
case '[':
|
||||||
case ']':
|
case ']':
|
||||||
case '~':
|
case '~':
|
||||||
case '!':
|
|
||||||
case ',':
|
case ',':
|
||||||
case ';':
|
case ';':
|
||||||
case ':':
|
case ':':
|
||||||
{
|
{
|
||||||
DBG_LOG("enter %c" , lex.current_c);
|
|
||||||
lex_save_char(&lex);
|
lex_save_char(&lex);
|
||||||
lex.token_buff.token = lex.current_c;
|
lex.token_buff.token = lex.current_c;
|
||||||
lex_save_token(&lex);
|
lex_save_token(&lex);
|
||||||
@@ -274,6 +284,48 @@ int lex_analysis(const char *text,int len){
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case '+':{
|
||||||
|
lex_save_char(&lex);
|
||||||
|
lex_get_next(&lex);
|
||||||
|
if(lex.current_c=='+'){
|
||||||
|
lex_save_char(&lex);
|
||||||
|
lex_get_next(&lex);
|
||||||
|
lex.token_buff.token = TOKEN_INC;
|
||||||
|
}else{
|
||||||
|
lex.token_buff.token = lex.current_c;
|
||||||
|
}
|
||||||
|
lex_save_token(&lex);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case '-':{
|
||||||
|
lex_save_char(&lex);
|
||||||
|
lex_get_next(&lex);
|
||||||
|
if(lex.current_c=='-'){
|
||||||
|
lex_save_char(&lex);
|
||||||
|
lex_get_next(&lex);
|
||||||
|
lex.token_buff.token = TOKEN_DEC;
|
||||||
|
}else{
|
||||||
|
lex.token_buff.token = lex.current_c;
|
||||||
|
}
|
||||||
|
lex_save_token(&lex);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case '!':
|
||||||
|
case '>':
|
||||||
|
case '<':
|
||||||
|
case '=':{
|
||||||
|
lex_save_char(&lex);
|
||||||
|
lex_get_next(&lex);
|
||||||
|
if(lex.current_c=='='){
|
||||||
|
lex_save_char(&lex);
|
||||||
|
lex_get_next(&lex);
|
||||||
|
lex.token_buff.token = TOKEN_EQ;
|
||||||
|
}else{
|
||||||
|
lex.token_buff.token = lex.current_c;
|
||||||
|
}
|
||||||
|
lex_save_token(&lex);
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
if (cislalpha(lex.current_c)) {
|
if (cislalpha(lex.current_c)) {
|
||||||
do {
|
do {
|
||||||
|
Reference in New Issue
Block a user