2008年10月29日星期三

lex and yacc

section of lex
1 lex程序中,位于%{ %}符号之间的内容会被拷贝到生成的c语言文件中。
2 %%用来标记一个部分的结束。
3 第二部分通常是正则表达式,{}之间的内容是一旦yytext与表达式匹配,会发生的动作(实际上也是C程序)。
4 第三部分实际上也是一段C程序,通常会直接被拷贝到编译所得的lex.yy.c,主函数通常都在这一部分,主函数中需要调用yylex()函数,yyin也在这里指定。
5 调用yylex()达到输入文件的尾端时,将调用yywrap(),该函数返回1时表示程序完成没有后续输入,如果返回0,则yylex继续读取yyin。
6 atoi是用来读取字符的,atof是用来读取数字的。
7 %option
8 yyless()的作用
9 yylval在y.tab.c中被定义为YYSTYPE类型(实际上是在*.y文件头部定义的共用体或者结构体,编译后会出现在y.tab.h中)
section of yacc
1 yacc拥有与lex相似的语法规则。
2 在yacc的主函数中,需要调用yyparse(),来处理语法解析,如果语法解析有误则通过yyerror来返回错误,yyin则是其标准输入。
3 yacc的标记定义段和规则定义段是从下向上解析
4 %left是左结合,%right是右结合,%nonassoc用于声明非结合操作符,UMINUS是代表一元减号的伪标记,%prec是什么意思
5 在以下两种情况中使用优先级:在表达式语法中或者解决虚挂的else冲突

没有评论: