一、实验目的:
理解语法分析在整个编译过程中的作用,掌握词法分析器生成工具Flex与语法分析器生成工具Bison的使用方法,并使用Flex和Bison实现简单的语法分析功能。
二、实验内容:
1. 使用Flex和Bison实现可以对整型数据正确进行带有括号的四则运算的计算器程序。
输入输出示例:
输入:2*(1+3)/(6-3)
输出:= 2
2. 使用Flex和Bison实现一个可以分析符合以下规则的表达式的语法分析器。
词法规则:
(1)标识符:[a-zA-Z][0-9a-zA-Z]+
(2)数字:[0-9]+
文法规则:
<表达式> ::= <项> { <加法运算符> <项> }
<项> ::= <因子> { <乘法运算符> <因子> }
<因子> ::= <标识符> | <数字> | ‘(’<表达式>‘)’
<加法运算符> ::= + | -
<乘法运算符> ::= * | /
输入输出示例:
输入: a*2-3/4+b
a-*b+c
输出: syntax correct
syntax error
三、实验环境:
Windows 7系统或更高版本
gcc 5.4.0 或更高版本
winflex & winbison 2.5.4 或更高版本
四、实验过程描述:
ex2.l代码
%{
// 引用由ex2.y生成的头文件ex2.tab.h
#include "ex2.tab.h"
%}
%%
[\n] {return END;}
[ ]+ {}
[0-9]+ {yylval = atoi(yytext); return DIGIT;}
[+] {return ADD;}
[-] {return SUB;}
[*] {return MUL;}
[/] {return DIV;}
[(] {return LP;}
[)] {return RP;}
%%
int yywrap() {
return 1;
}
ex2.y代码:
%{
#include <stdio.h>
// 解析错误的处理函数
void yyerror(const char* msg) {printf("ERROR: %s\n", msg);}
// 引用词法分析的函数
int yylex();
%}
%token DIGIT LP RP
%token END
%left ADD SUB
%left MUL DIV
%%
calc :
| calc exp END {printf(" = %d\n", $2);}
;
exp : item {$$ = $1;}
| exp ADD exp {$$ = $1 + $3;}
| exp SUB exp {$$ = $1 - $3;}
| exp MUL item {$$ = $1 * $3;}
| exp DIV item {$$ = $1 / $3;}
;
item : DIGIT {$$ = $1;}
| LP exp RP {$$ = $2;}
;
%%
int main() {
// 进行语法分析
return yyparse();
}
ex3.l代码:
%{
// 引用由ex3.y生成的头文件ex3.tab.h
#include "ex3.tab.h"
%}
%%
[\n] {return END;}
[ ]+ {}
[0-9]+ {yylval = atoi(yytext); return DIGIT;}
[+] {return ADD;}
[-] {return SUB;}
[*] {return MUL;}
[/] {return DIV;}
[(] {return LP;}
[)] {return RP;}
[a-zA-Z]+[0-9a-zA-Z]* {return VAR;}
%%
int yywrap() {
return 1;
}
ex3.y代码
%{
#include <stdio.h>
// 解析错误的处理函数
void yyerror(const char* msg) {printf("ERROR: %s\n", msg);}
// 引用词法分析的函数
int yylex();
%}
%token DIGIT LP RP
%token END VAR
%left ADD SUB
%left MUL DIV
%%
line : exp END {printf("syntax correct\n");}
exp : item
| exp ADD item
| exp SUB item
;
item : factor
| item MUL factor
| item DIV factor
;
factor : DIGIT
| VAR
| LP exp RP
%%
int main() {
// 进行语法分析
return yyparse();
}
五、实验结果及分析:
图1为使用Flex和Bison实现可以对整型数据正确进行带有括号的四则运算的计算器程序执行结果。由图可知,实验结果与正确结果一致,该程序正常运行,实现了对整型数据正确进行带有括号的四则运算。
图2为使用Flex和Bison实现一个可以分析符合规则的表达式的语法分析器执行结果。由图可知,在测试中,a+*b-255、5//a-c+25-4、myList * (size + 5 - 3ac)是不符合规则的。该程序能够正常运行,执行结果正确。
六、实验心得体会:
之前对语法分析的了解仅仅停留在理论知识,但通过老师这几节课中理论结合实践的讲解,让我对语法分析有了更加深刻的学习。在做实验的过程中遇到了很多问题,代码运行不成功,但通过观看上课回放、问同学,发现了代码错误的问题,并及时改正,最终完成了此次实验。
通过此次实验,我大致理解语法分析在整个编译过程中的作用,掌握词法分析器生成工具Flex与语法分析器生成工具Bison的使用方法,并使用Flex和Bison实现简单的语法分析功能。