[原理] Lex Yacc规则格式
历史
- 在1975年之前,写出一个编译器是很麻烦的事情。 在1975年的时候,有两篇文章的发表,简化了编译器的编写。
Lex - A Lexical Analyzer Generator.
Yacc: Yet Another Compiler Compiler. - Lex和YACC的具体实现细节可以在2006年的这本书中找到:
Compilers, Principles, Techniques and Tools (2nd edition). Addison-Wesley, Reading, Massachusetts. -
WinFlex和WinBison是Flex和Bison的Windows版本。
编译顺序
- Lex的输入:词法规则(.l文件)
- Lex的输出:词法分析器
- Yacc的输入:语法规则(.y文件)
- Yacc的输出:语法分析器
- 宿主程序使用词法分析器和语法分析器,产生分析结果。
规则格式
Lex代码示例
Yacc文法
Yacc的语法是BNF范式的变种。BNF文法可以用来表示上下文无关文法,大多数的编程语言都可以用BNF来表示。
Shift -Reduce冲突
例子中的第6步,E+E可以进行Reduce,但是也可以进行Shift。使用符号结合方向和优先级解决。
Reduce-Reduce冲突
Yacc语法格式
Yacc代码示例
- lex文件
词法分析器输出的Token类型:VARIABLE,INTEGER,-,+,(,),=,/,\n,a-z - yacc文件
词法标识:INTEGER,VARIABLE
符号优先级与结合方式
文法标识:program,statement,expr
int sys[26]:a-z 26个变量的数值 - yytext
词法分析器匹配到的字符串 - yylval
yytext相关的数值,比如:在词法分析器匹配到数字的时候,设置yylval=atoi(yytext) ,在语法分析器,就可以通过$1,$2,来读取对应的yylval。 - 实际上,yacc内部有两个栈,一个是分析栈,一个是内容栈,分别用yytext和yylval来读取。
-
Lex Yacc (一) 入门 这里说的更加详细一些。