一、实验目的
熟悉Yacc的使用方法
掌握使用Yacc计算整数表达式的方法
二、实验器材
计算机 安装了C语言开发环境、Flex工具和Bison工具
三、实验题目
编写相应的Lex和Yacc程序,计算整数表达式的值,
整数表达式中可能含有 + - * / ( ) 和整数值。
下列是一些整数表达式示例:
2 + 3
2+3-4
2-3+4
2-(2+4)
2*3+4*5
3+44/5
四、实验内容
1. 设计整数表达式的正规式词法
2. 设计整数表达式的文法
3. 用Flex和Bison生成整数表达式的计算程序,并编译运行。
源码:
Word.l文件
源码:
Word.l文件
%{
#include "syntax.tab.h"
#include <stdio.h>
#include <stdlib.h>
int yyerror(const char *);
%}
%%
[0-9]+ {yylval = atoi(yytext); return INTEGER;}
[+\-*/()\n] {return *yytext; /* 返回操作符 */ }
[ \t] { ; /*skip whitespace */ }
. { yyerror("invalid character");}
%%
int yywrap(){
return 1;
}
Syntax.y文件
%{
#include <stdio.h>
#include <stdlib.h>
int yylex(void);
int yyerror(const char*);
%}
%token INTEGER
%left '+' '-'
%left '*' '/'
%%
program:
program expr '\n' { printf("%d\n",$2); }
|
;
expr:
INTEGER {$$ = $1; }
| expr '+' expr {$$ = $1+$3;}
| expr '-' expr {$$ = $1- $3;}
| expr '*' expr {$$ = $1*$3; }
| expr '/' expr {$$ = $1/$3; }
| '(' expr ')' {$$=$2; }
;
%%
int yyerror(const char *s) {
fprintf(stderr,"error: %s\n",s);
return 0;
}
int main(){
yyparse();
return 0;
}