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()或者自己申请内存来保存字符串拷贝,从而使字符串的拷贝拷贝位于刚刚分配的内存中。
strdup
原型:extern char *strdup(char *s);
头文件:#include <string.h>
用法:char *strdup(char *s);
功能:复制字符串s
说明:strdup()在内部调用了malloc()为
变量分配内存,当程序结束后,必须用free()释放相应的内存空间,否则会造成内存泄漏
举例:
// strdup.c
//#include <syslib.h>
#include <stdio.h>
#include <string.h>
int main()
{
char *s="Golden Global View";
char *d;
clrscr();
d=strdup(s);
printf("%s",d);
free(d);
getchar();
return 0;
}
例
CString sPath="d:\\1.jpg";
LPTSTR str = strdup( sPath );
yywrap()
当词法分析程序遇到文件结尾时,它调用例程yywrap()来找出下一步要做什么,如果返回0,扫描程序继续扫描,如果返回1,扫描程序就返回报告文件结尾需标记。
lex库中yywrap()的标准版本总是返回1,如果yywrap()返回指示有更多的输入0,那么它首先需要调整指向新的文件yyin,可能使用fopen()。
起始状态
在定义段可以声明起始状态,也称起始状态条件或起始规则。起始状态用于限制某些规则的范畴,或者改变词法分析程序处理部分文件的方式。
没有起始状态的那些规则能应用于任何状态。
动作中的BEGIN语句设置了当前的起始状态。