欢迎来到天天文库
浏览记录
ID:46949677
大小:353.31 KB
页数:28页
时间:2019-12-01
《《lexyacc使用基础》PPT课件》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、flex/bison使用基础fLex编译器C语言编译器fLex文件(文本文件)Lex.yy.c可执行的词法分析工具输入文件单词符号定义部分规则部分用户子程序部分LEX(flex)的程序结构第一部分定义部分定义部分%{……….%}正规式内容Include、声明语句等C语句及正则表达式%{#include“stdio.h”#include”y.tab.h”intlineno%}delim[t]letter[A-Za_z]digit[0-9]id{letter}({letter}
2、{digt})*第二部分规
3、则部分规则部分起始于%%,终止于%%,其间是词法规则(正则表达式)和相应的动作组成格式P1{A1}P2{A2}P3{A3}其中,Pi是一个正规式(第一部分定义的正规式的名字)Ai是一个程序段{C语句}Lex中的正则表达式规则转义字符:[]:表示一个集合,可以结合-表示一个范围,如[abc],[a-zA-Z]?*+:0或1次,任意次,至少一次.:任意一个符号
4、:二选一():分组,括号内的内容被看作一个原子,如(ab)识别规则%%{++num_line;}[A-Za-z]+{++num_words;}.{+
5、+num_chars;}%%注意:在识别规则中引用正规式的名字时,要用{}分隔。例如:{letter}({digit}
6、{letter})*用户子程序部分包含用c语言编写的子程序,这些子程序可以用在前面的动作中,这样可以达到简化编程的目的。Lex编程的第三段,也就是最后一段覆盖了C的函数声明(有时是主函数)。注意这一段必须包括yywrap()函数的定义。用户子程序的相关问题Main(intargc,char*argv[]){--argc;++argv/*跳过对第一个文件,即main函数多对应的.exe文件*
7、/if(argc>0)yyin=fopen(argv[0],’r’);elseyyin=stdinyylex();}一个完整的lex(flex)程序%{intwordCount= 0; %}chars[A-za-z‘.“] numbers ([0-9])+delim[t] whitespace {delim}+ words {chars}+%%{words} {wordCount++; }{whitespace} { }{number
8、s} {numcount++ }%%void main() {yylex(); /* start the analysis*/printf(" No of words: %d",wordCount); }intyywrap() { return 1; }fLex编译器C语言编译器fLex文件(文本文件)Lex.yy.c可执行的词法分析工具输入文件单词符号文法分析器生成工具bisonYacc/Bison是一
9、个通用的工具,能够根据用户指定的规则,生成一个词法分析程序。bison/yacc文件的格式declarations(声明)%%rules(规则)%%programs(代码)声明段声明段声明一些符号常量,可以为空。lex一样,声明段中可以有出现在目标C程序中的代码,放在%{…%}中还有一些yacc关键词可以指示出token的结合顺序:%left左结合%right右结合%nonassoc不结合%token声明token%{#include#includeintregs[26]
10、;intbase;%}%startlist%tokenDIGITLETTER规则段规则段的结构如下,A :BODY ;A表示非终结符名,BODY表示产生式和动作。产生式包括非终结符和终结符,非token的终结符用“”引用。动作(action)则是在输入被当前规则识别出来时而执行的。动作实际上就是C的代码,写在{}中。为了沟通词法分析器和动作,yacc引入了形式变量,以$开头。如果希望获得词法分析器和前面的动作返回的值,我们可以使用$1,$2,…。$i表示一条规则右侧第i个单元的值。比如有这样的一条规则,A
11、:BCD ;C的返回值为$2,D为$3。$$产生式左部的非终结符的属性list:/*empty*/
12、liststat''
13、listerror'‘{yyerrok;};stat:expr{printf("=%d",$1);}
14、LETTER'='expr{regs[$1]=$3;};expr:'('expr')'{$$=$2;}
15、expr'+'expr{$$=$1+$3;}
16、expr'-'expr{$$=
此文档下载收益归作者所有