当前位置: 首页 >> 程序设计 >> yylex学习笔记
 

yylex学习笔记

作者:      来源:gawk.cublog.cn     发表时间:2008-06-05     浏览次数:      字号:    

以前的学习笔记,看着笔记本越来越破,以免丢失,整理一下。
 
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语句设置了当前的起始状态。

责任编辑 webmaster

 
 
 
 
 
评论更多>>
 
 
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •