用Yacc做语法分析
YACC简介
Yacc 全称 Yet Another Compiler Compiler
Yacc是一个用来生成编译器的编译器(编译器代码生成器)。yacc生成的编译器主要是用C语言写成的语法解析器(Parser),需要与词法解析器Lex一起使用,再把两部份产生出来的C程序一并编译。
作为 Yacc 对说明文件中的 %token NUMBER 声明的对应。Yacc 坚持定义所有的符号记号本身,而不是从别的地方引入一个定义。但是却有可能通过在记号声明中的记号名之后书写一个值来指定将赋给记号的数字值。
Yacc的输入是巴科斯范式(BNF)表达的语法规则以及语法规约的处理代码,Yacc输出的是基于表驱动的编译器,包含输入的语法规约的处理代码部分。
Yacc是开发编译器的一个有用的工具,采用LALR(1)语法分析方法。
Yacc是一个用来生成编译器的编译器(编译器代码生成器)。yacc生成的编译器主要是用C语言写成的语法解析器(Parser),需要与词法解析器Lex一起使用,再把两部份产生出来的C程序一并编译。
作为 Yacc 对说明文件中的 %token NUMBER 声明的对应。Yacc 坚持定义所有的符号记号本身,而不是从别的地方引入一个定义。但是却有可能通过在记号声明中的记号名之后书写一个值来指定将赋给记号的数字值。
Yacc的输入是巴科斯范式(BNF)表达的语法规则以及语法规约的处理代码,Yacc输出的是基于表驱动的编译器,包含输入的语法规约的处理代码部分。
Yacc是开发编译器的一个有用的工具,采用LALR(1)语法分析方法。
YACC实验内容
1.实验环境配置
安装Parser Generator。并编译lex和yacc函数库
2.编写Lex程序
题目:编写一个Yacc程序。改程序以布尔表达式作为输入,并计算这个表达式的值。
布尔表达式为:
bexpr ->bexpr or bterm | bterm
bterm -> bterm and bfactor | bfactor
bfactor-> not bfactor | (bexpr) | true | false
编写Yacc程序如下:
myparser.y*
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35%{ #include "mylexer.h" %} //定义 %include{ #ifndef YYSTYPE #define YYSTYPE int #endif } %token TRUE %token FALSE %% //规则 line : bexpr 'n' {if($1==1){printf("true");}else{printf("false");}} | 'n' {printf("n");} ; bexpr: bexpr '&' bterm {if(($1==1)&&($3==1)){$$=1;}else{$$=0;}} | bterm bterm: bterm '|' bfactor {if(($1==0)&&($3==0)){$$=0;}else{$$=1;}} | bfactor ; bfactor: '~'bfactor {if($2==1){$$=0;}else{$$=1;}} | '('bexpr')' {$$=$2;} |TRUE |FALSE ; %% //程序段 #pragma comment(lib,"yl.lib") extern FILE *yyin; int main(void) { yyin=stdin; return yyparse(); }
编写Lex程序如下:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13//mylexer.l %{ #include "myparser.h" #include<stdlib.h> extern int yylval; %} //声明 %% //规则部分 true {yylval=1;return TRUE;} false {yylval=0;return FALSE;} .|n {return yytext[0];} %%
然后可以通过输入一些布尔表达式进行测试。
最后
以上就是落后帽子最近收集整理的关于用Yacc做语法分析YACC简介YACC实验内容的全部内容,更多相关用Yacc做语法分析YACC简介YACC实验内容内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复