编译原理 期末复习题 语法分析器的生成器
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
语法分析器的生成器
yylex ( ) { int c; while ( ( c = getchar ( ) ) == ‘ ’ ); if ( ( c == ‘.’ ) | | (isdigit (c) ) ) { ungetc (c, stdin); scanf ( “% lf ”, &yylval); return NUMBER; } return c;
}
语法分析器的生成器
书中图4-58、4-59、4-60
命令: yacc –d t.y gcc t.tab.c -ly -ll
若果使用lex工具产生词法分析器,则: lex t.lex
语法分析器的生成器
语法分析器的生成器Yacc
Yacc源程序 translate.y y.tab.c
输入
Yacc 编译器
C 编译器
a.out
y.tab.c a.out 输出
语法分析器的生成器
• 例 简Leabharlann Baidu计算器
– 输入一个表达式并回车,显示计算结果 – 也可以输入一个空白行
语法分析器的生成器
%{ # include <ctype .h> # include <stdio.h > # define YYSTYPE double /将栈定义为double类型 / %}
| NUMBER
;
%%
语法分析器的生成器
lines
: lines expr ‘\n’ {printf ( “%g \n”, $2 ) }
| lines ‘\n’
| / /
;
expr
: expr ‘+’ expr {$$ = $1 + $3; }
| expr ‘’ expr {$$ = $1 $3; }
| expr ‘’ expr {$$ = $1 $3; }
| expr ‘’ expr {$$ = $1 $3; }
| expr ‘/ ’ expr {$$ = $1 / $3; }
| ‘(’ expr ‘)’
{$$ = $2; }
| ‘’ expr %prec UMINUS {$$ = $2; }
%token NUMBER %left ‘+’ ‘’ %left ‘’ ‘/ ’ %right UMINUS %%
语法分析器的生成器
lines
: lines expr ‘\n’ {printf ( “%g \n”, $2 ) }
| lines ‘\n’
| / /
;
expr
: expr ‘+’ expr {$$ = $1 + $3; }
| expr ‘’ expr {$$ = $1 $3; }
| expr ‘/ ’ expr {$$ = $1 / $3; }
| ‘(’ expr ‘)’
{$$ = $2; }
| ‘’ expr %prec UMINUS {$$ = $2; }
| NUMBER
;
%%
-5+10看成是-(5+10), 还是(-5)+10? 取后者