我现在用flex+bison实现的,昨天看了一晚上。。。
现在实现了定义,真的很不错了。
在lexer.l中,标识符的正则表达式是:
[a-zA-Z][a-zA-Z0-9_]* { yylval.strval = strdup(yytext); return IDENTITY; }
然后需要一个赋值符:
":" { return ASSIGN; }
然后定义数字的正则表达式:
-?[0-9]+ { yylval.intval = atoi(yytext); return INT_NUMBER; }
然后转到parser.y,做定义语法:
statement: sentence '.' { printf("STMT\n"); }
| statement sentence '.'
;
这个是初始终结符,用点号作为结束,emmmm,感觉不错,这个自制语言我已经早就变好了。
sentence: decl_stmt { $$ = $1; }
| assign_stmt { $$ = $1; }
| /* empty rule */ { $$ = 0; }
;
decl_stmt: id_list { printf("stmt_decl\n"); }
| assign_stmt { printf("stmt_decl & assignment\n"); }
;
id_list: IDENTITY { printf("id: %s\n", $1); $$ = $1; }
| id_list ',' IDENTITY { printf("id: %s\n", $3); $$ = $3; }
;
assign_stmt: IDENTITY ASSIGN expr { printf("id: %s\nASSIGNMENT\n", $1); }
;
上面就是现阶段所有语法,它可以实现的语句是:
a: 1.
它能识别这个定义语句,效果如下:
可见已经正确解析出来了。