编译原理—yylex学习笔记

yyleng
只要扫描程序匹配标记时,标记的文本就存储在以空字符终止的字符串yytext中,而且它的长度存储在yyleng中,yyleng中的长度与由strlen(yytext)返回的值是相同的。
 
yyless()
从与规则相关的代码中调用yyless(n),这条规则推回除标记开头的几个字符以外的所有字符。当决定标记之间边界的规则不方便表示为正则表达式时,它是很有用的
例:
\"[^"]\"  {
           if(yytext[yyleng-2]=='\\')
           {
            yyless(yyleng-1);
            yymore();
           }
           else
            {
            .......
            }
          }
yyless()的另一用处是使用不同的其实状态的规则从新处理标记:
sometoken{BEGIN OTHER_STATE;yyless(0);}
 
yylex()
由lex创建的扫描程序的入口点yylex()。调用yylex()启动或者重新开始扫描。如果lex动作执行讲数值传递给调用的程序return,那么对yylex()的下次调用就从它的停止地方继续。
 
yylex()中的用户代码
规则段中的所有代码都被拷贝到yylex()。以空白开始的行被假定是用户代码。"%%"后的代码直接放置在接近扫描程序的开始处,在第一条执行的语句之前。
 
yymore()
可以从与规则相关的代码中调用yymore(),这条规则告诉lex给这个标记附加下一个标记
 
yytext
每当词法分析程序匹配标记时,标记的文本就存储在以空字符结尾的字符串yytext中
每次匹配一个新的标记时,就要替换yytext的内容,如果yytext的内容还要使用,通过strdup()或者自己申请内存来保存字符串拷贝,从而使字符串的拷贝拷贝位于刚刚分配的内存中。
 
yywrap()
当词法分析程序遇到文件结尾时,它调用例程yywrap()来找出下一步要做什么,如果返回0,扫描程序继续扫描,如果返回1,扫描程序就返回报告文件结尾需标记。
 
lex库中yywrap()的标准版本总是返回1,如果yywrap()返回指示有更多的输入0,那么它首先需要调整指向新的文件yyin,可能使用fopen()。
 
起始状态
在定义段可以声明起始状态,也称起始状态条件或起始规则。起始状态用于限制某些规则的范畴,或者改变词法分析程序处理部分文件的方式。
没有起始状态的那些规则能应用于任何状态。
动作中的BEGIN语句设置了当前的起始状态。


转载自:http://blog.chinaunix.net/uid-13532695-id-90400.html

你可能感兴趣的:(编译原理,编译原理,yylex)