ILD

Flex学习笔记3:Actions
作者:YUAN JIANPENG 邮箱:yuanjp89@163.com
发布时间:2019-7-31 站点:Inside Linux Development

Actions

rule中的每一个pattern有对一个对应的action。其可以是任何的C语句。pattern以第一个未转义的空白字符结束。行中剩下的部分是action。如果action是空,那么pattern被匹配,但是会被丢弃。


如果action包含{,那么action一直包含到匹配的},可以跨多行。flex知道C语法,不会愚蠢的匹配字符串或注释中的}。


action也可以以%{开头,以%}结束。


如果action只包含一个|,表示和下一个rule的action相同。


action可以包含return语句,这样yylex()就会返回。每次yylex()被调用,它都会继续从上次退出的地方开始处理。直到处理玩所有的输入,或者执行了一个action中的return。


action可以自由的修改yytext,但是不能延长它(会覆盖后面的输入),但如果是%array,则没有这个限制。

action可以自由的修改yyleng,除非它们不应当这么做。


action里面可以包含一些特殊的语法:


ECHO 拷贝yytext到scanner的输出

BEGIN

REJECT 指示scanner选择第二个最佳匹配的rule继续处理匹配的输入。

yymore() 告诉scanner,将这次的yytext放到下一次匹配的yytext前面,两者合并。

yyless(n) 把yytext的前n字符放回输入流

unput(c) 把字符c放到输入流,注意,如果使用%pointer,unput会破坏yytext。

input() 读取下一个输入

YY_FLUSH_BUFFER;

yyterminate(),它结束scanner,返回0给scanners的调用者,暗示这all done。


The generated scanner

flex的输出是文件lex.yy.c,包含了scanning routine yylex()。许多匹配token的表,许多辅助函数和宏。缺省,yylex()的原型如下:

int yylex()

{

}

但是可以使用YY_DECL宏修改,例如:

#define YY_DECL float lexscan( a, b ) float a, b;


当yylex()被调用时,它从yyin(默认是stdin)读取输入。它持续读,直到文件结束或者return。


当scanner达到end of file,继续调用yylex的行为是未定义的。除非yyin指向一个新的文件,或者yyrestart()被调用。


yyrestart(),接收一个FILE *参数作为输入,如果为NULL,你要自定义YY_INPUT来读取输入。


scanner使用block read。定义YY_INPUT()宏。

YY_INPUT(buf,result,max_size)

返回YY_NULL表示输入结束,否则表示读取的字节数。


如果scanner调用YY_INPUT()返回YY_NULL,它去调用yywarp()函数,如果返回false,则会继续读取yyin。否则scanner结束,返回0。


如果你没有自己的yywarp(),你必须使用 %option noyywarp,或者链接-lfl来获取缺省的yywarp。


ECHO,输出到yyout,缺省是stdout,但是你可以自定义。


Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.