第十二章用户可用的值
这个章节概述了一些在规则动作中对用户有效的值。
char *yytext
持有当前标记的文本。它可以被修改,但是不能被加长(不能在末尾添加字符)。
如果专门的指令%array出现在扫描器描述的第一部分,那么yytext将被声明为char yytext[YYLMAX],这里的YYLMAX是一个宏定义,如果你不喜欢默认值(通常为8KB),可以在第一部分中重新定义。使用%array会导致扫描器的速度变慢,但是yytext的值不受调用unput()的影响,当yytext是字符指针时,调用unput()可能会破坏它的值。与%array相对的是%pointer,这是默认值。
当产生C++扫描器类(‘-+’标志)时不可以使用%array。
int yyleng
持有当前标记的长度
FILE *yyin
默认情况下flex从yyin读取文件。它可以被重新定义,但这样做只有在扫描开始之前或遇到EOF之后才有意义。在扫描过程中改变它会产生意想不到的后果,因为flex缓冲了它的输入;请使用yyrestart()替代。一旦扫描因为看到文件结束而终止,就可以在新的输入文件上赋值yyin,然后再次调用扫描器继续扫描。
void yyrestart(FILE *new_file)
可以被调用让yyin指向新的输入文件。切换到新文件是立即的(任何先前缓冲的输入都将丢失)。请注意,使用yyin作为参数调用yyrestart()会丢弃当前的输入缓冲区,并继续扫描相同的输入文件。
FILE *yyout
是执行ECHO操作的文件。它可以由用户重新分配。
YY_CURRENT_BUFFER
返回当前缓冲区的YY_BUFFER_STATE句柄
YY_START
返回对应当前开始条件的整数值。随后,你可以将此值与BEGIN一起使用以返回到之前的开始条件。
第十三章YACC接口
flex的主要用途之一是作为yacc解析器生成器的伙伴。yacc解析器期望调用名为yylex()的函数来查找下一个输入标记。函数应该返回下一个标记的类型,并将任何相关的值放入到全局变量yylval中。要将flex和yacc一起使用,可以为yacc指定’-d’选项,指示它生成文件y.tab.h,其中包含yacc输入中出现的所有%token的定义。然后将该文件包含在flex扫描器中。例如,如果由一个标记是TOK_NUMBER,扫描器的部分看起来是这样的:
%{
#include "y.tab.h"
%}
%%[0-9]+ yylval = atoi( yytext ); return TOK_NUMBER;