语法和语义分析器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二语法和语义分析器
一实验目的
1.掌握 Yacc 的基本用法,并能够根据语言给出语法规则的定义,最后生成语言的解析器;
2.使用Yacc实现一个高级计算器程序。
二实验内容
实现一个简单的表达式计算器,要求能进行加、减、乘、除、幂运算,注意优先级。求写出详细的步骤和相应的flex源程序。
三实验步骤
1.在linux中安装flex,使用如下命令:
Undo apt-lex install bison
2.实验源程序
%{
#define YYSTYPE double
#include
#include
#include
int yylex (void);
void yyerror (char const *);
%}
%token NUM
%left '-' '+'
%left '*' '/'
%%
input:
| input line
;
line: '\n'
| exp '\n' { printf ("\t%.10g\n", $1); }
| error '\n' {yyerrok;}
exp: NUM { $$ = $1; }
| exp '+' exp { $$ = $1 + $3; }
| exp '-' exp { $$ = $1 - $3; }
| exp '*' exp { $$ = $1 * $3; }
| exp '/' exp { $$ = $1 / $3; }
| '(' exp ')' { $$ = $2; }
;
%%
yylex ()
{
int c;
while ((c = getchar ()) == ' ' || c == '\t');
if (c == '.' || isdigit (c)) {
ungetc (c, stdin);
scanf ("%lf", &yylval);
return NUM;
}
if (c == EOF) return 0;
return c;
}
main ()
{
return yyparse ();
}
yyerror(char *msg)
{
printf("error %s encountered\n", msg);
}四实验结果
五实验内容中遇到的问题、解决方法和体会。
通过本次实验实现一个简单的表达式计算器,要求能进行加、减、乘、除运算,注意运算的优先级问题。掌握了Yacc 的基本用法,并能够根据语言给出语法规则的定义,最后生成语言的解析器。但在运行时出现了错误,经过同学帮助修改成功。