
编译原理第四次实验
2024年5月11日...大约 2 分钟
编译原理第四次实验
实验介绍
一、实验目的
掌握LR语法分析器的构造原理,掌握Bison工具的编程方法
二、实验内容
用Bison编写一个语法分析程序,使之与词法分析器结合,能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子。
三、实验要求
1.参考实验示例完成,提交实验报告。 2.实验的结果为:按归约的先后顺序显示每次归约时所使用的产生式。(最右推导使用产生式的逆过程)
- 根据产生式编写
compile.y
, 核心代码如下
program : block {printf("program->block\n");} ;
block : '{' decls stmts '}' {printf("block->{decls stmts}\n");} ;
decls : decls decl { printf("decls->decls decl\n"); }
| { printf("decls->null\n"); }
;
decl : type ID ';' { printf("decl->type ID;\n"); }
type : BASIC { printf("type->BASIC\n"); }
stmts : stmts stmt {printf("stmts->stmts stmt\n");}
| /*empty*/ {printf("stmts->null\n");}
;
stmt : ID '=' expr ';' {printf("stmt->id = expr;\n");}
| WHILE '(' bool ')' stmt {printf(" stmt->while(bool) stmt\n");}
| IF '(' bool ')' stmt {printf("stmt->if(bool) stmt\n");}
| IF '(' bool ')' stmt ELSE stmt {printf("stmt->if(bool) stmt else stmt\n");}
| BREAK ';' {printf("stmt->break;\n");}
| block {printf("stmt->block\n");}
;
bool : bool OR join { printf("bool->bool||join\n"); }
| join { printf("bool->join\n"); }
;
join : join AND equality { printf("join->join&&equality\n"); }
| equality { printf("join->equality\n"); }
;
equality : equality RELOP_EQ rel { printf("equality->equality==rel\n"); }
| equality RELOP_NEQ rel { printf("equality->equality!=rel\n"); }
| rel { printf("equality->rel\n"); }
;
rel : expr RELOP_LT expr { printf("rel->expr<expr\n"); }
| expr RELOP_LE expr { printf("rel->expr<=expr\n"); }
| expr RELOP_GE expr { printf("rel->expr>=expr\n"); }
| expr RELOP_GT expr { printf("rel->expr>expr\n"); }
| expr { printf("rel->expr\n"); }
;
expr : expr '+' term { printf("expr->expr + term\n"); }
| expr '-' term { printf("expr->expr - term\n"); }
| term { printf("expr->term\n");}
;
term : term '*' factor { printf("term->term*factor\n"); }
| term '/' factor { printf("term->term/factor\n"); }
| factor { printf("term->factor\n");}
;
factor: '(' expr ')' { printf("factor->(expr)\n"); }
|ID { printf("factor->id\n"); }
|CONST { printf("factor->CONST\n"); }
;
- 编译运行,命令行如下:
flex compile.l
bison --yacc -d compile.y
gcc y.tab.c
编译得到 a.exe
- 实验结果如下:
对于code1.txt
{
i = 2;
while (i <=100)
{
sum = sum + i;
i = i + 2;
}
}
得到如下结果

符合实验指导书的示例
Powered by Waline v3.4.1