语法和语义分析器

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 的基本用法,并能够根据语言给出语法规则的定义,最后生成语言的解析器。但在运行时出现了错误,经过同学帮助修改成功。

相关文档
最新文档