语法分析(15)...

到这里词法分析模块就接近尾声了, 下面对词法分析模块进行总结 :

递归下降本质上也算是自顶向下的分析算法, 适合手工编码, 它相对来说更加灵活, 能够对于特定的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 '
';
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
", 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
[风@ ~] $ 

大概就是这样...

原文地址:https://www.cnblogs.com/nzhl/p/5535474.html