Chinaunix首页 | 论坛 | 博客
  • 博客访问: 309376
  • 博文数量: 60
  • 博客积分: 2579
  • 博客等级: 大尉
  • 技术积分: 570
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-17 14:54
文章分类

全部博文(60)

文章存档

2011年(1)

2010年(1)

2009年(35)

2008年(23)

分类: C/C++

2008-06-04 13:02:30

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

上一篇:ascii码

下一篇:yacc的man

给主人留下些什么吧!~~