flex函数宏详解.docxVIP

  • 13
  • 0
  • 约6.7千字
  • 约 12页
  • 2018-01-04 发布于河南
  • 举报
flex函数宏详解

1.内置变量 yy_create_buffer:见后面的缓冲管理 yy_delete_buffer:见后面的缓冲管理 yy_flex_debug:见后面的缓冲管理 yy_init_buffer:见后面的缓冲管理 yy_flush_buffer:见后面的缓冲管理 yy_load_buffer_state:见后面的缓冲管理 yy_switch_to_buffer:见后面的缓冲管理 yyin: 输入缓冲流的文件指针,可以被替换以实现解析某个自定义的文件 yyleng:当前匹配字串的长度 yylex: 解析函数,接口 yylineno:当前匹配的文件行号 yyout:?? 输出流的指针 yyrestart: 手动调用yyrestart.会重启解析 yyrestart( yyin );一般是打开某个文件之后,yyrestart(yyin)再解析. yytext: 当前匹配的字串 yywrap: 解析一个文件完毕之后,会调用yywrap:返回1表示结束,0表示继续(此时最好重新打开yyin或者重置yyin流) 2. 几个重要函数:1). yymore(): yymore()的含义是,当当前匹配的字串之后,想把后面配置的字串附加到这个字串后面,组成新的token返回. 比如: %% mega-??? ECHO; yymore(); kludge?? ECHO; 如果:“mega-kludge the following will write mega-mega-kludge to the output。 为什么呢? 首先遇到 mega-,接着被more了一下,因此就会把kludga附加到mega-后面,而后面的kludge的动作又是打印,因此会打印出:mega-mega-kludge 2). yyless(): yyless()的含义是:当当前的匹配之后,我想只返回前面几个字符,并且把后面回退到输入?比如: %% foobar??? ECHO; yyless(3); [a-z]+??? ECHO; input foobar the following will write out???? foobarbar: 为什么呢? foobar输入之后,匹配foobar,ECHO打印出来,接着yyless(3),则输入流变为bar了(yytext为foo).接着再匹配,于是匹配??? 到[a-z]+,因此再次打印出bar. 3).BEGIN: flex下一个起始解析状态。见第3节,flex的状态. 4).REJECT:? 相当于拒绝此匹配,让系统重新找下一个匹配。abcd, it will write abcdabcaba to the output: %% a??????? | ab?????? | abc????? | abcd???? ECHO; REJECT; .|\n???? /* eat up any unmatched character */ 5).unput(c): 把c重新放到输入流。 6).input(): 读取输入流下一个字符 7).yyrestart(): 该函数迫使yylex重新解析。yyrestart有个函数指针流,可以再打开之后,重新使用yyrestart(). 3. 解析源管理: 1). 默认是从yyin获取,而yyin则是stdout,也可以是其它文件。 if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; 2). 如果你打开了一个文件,并把yyin指向此文件,则从该文件中读取.比如: 在main中: FILE* fp = NULL; fp = fopen(hell.txt, r); yyin = fp; 之后再使用 yylex() 则flex从hell.txt中读取信息并解析. 3).从字符串中解析 先使用下列函数,转化缓冲,之后再使用 yylex() a. yy_scan_string(char*).使用了yy_scan_string(char*)之后,flex会把char*放到yy的输入缓冲中(会调用到yy_switch_to_buffer.) b. yy_scan_bytes(const char *base, int len); c. yy_scan_buffer(char *base, yy_size_t size) 这几个函数内部都使用的是缓冲切换的创建等函数,见后面的章节. 4).利用EOF内置规则,重新打开多个文件输入: 比如: EOF { if ( *++filelist ) yyin = fopen( *filelist, r ); else yyterminate(); } 5).多缓冲问题: a.此问题可以按上面的

文档评论(0)

1亿VIP精品文档

相关文档