到这里词法分析模块就接近尾声了, 下面对词法分析模块进行总结 :
递归下降本质上也算是自顶向下的分析算法, 适合手工编码, 它相对来说更加灵活, 能够对于特定的DSL进行更加灵活的处理优化, 但是相对来说比较慢.而自动生成器则恰好相反, 接下来是一个LR(1)语法生成器的实例 -- YACC.
首先这是yacc所需的源文件的结构, 通过输入这个文件yacc能为我们生成实际的语法分析器的代码...
由图中可以看出该文件分为三个部分, 下面是实例代码 :
1 %{ 2 #include <stdio.h> 3 #include <stdlib.h> 4 int yylex(); 5 void yyerror(char* err); 6 %} 7 8 %left '+' 9 10 %% 11 12 lines: line 13 | line lines ; 14 15 line: exp '\n'; 16 exp: n 17 | exp '+' exp ; 18 19 n: '1' 20 | '2' 21 | '3' 22 | '4' 23 | '5' 24 | '6' 25 | '7' 26 | '8' 27 | '9' 28 | '0' ; 29 30 %% 31 32 int yylex(){ 33 return getchar(); 34 } 35 36 void yyerror(char* err){ 37 printf("%s\n", err); 38 } 39 40 int main (int argc, char* argv[]){ 41 yyparse(); 42 return 0; 43 }
这是输出结构 :
[风@ ~] $ bison test.y [风@ ~] $ gcc test.tab.c [风@ ~] $ ./a.out 2+3+4 3+4 2 + syntax error [风@ ~] $
大概就是这样...