欢迎来到天天文库
浏览记录
ID:37709935
大小:18.61 KB
页数:12页
时间:2019-05-29
《flex函数宏详解》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、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:解
2、析函数,接口 yylineno:当前匹配的文件行号 yyout: 输出流的指针 yyrestart:手动调用yyrestart.会重启解析 yyrestart(yyin);一般是打开某个文件之后,yyrestart(yyin)再解析. yytext:当前匹配的字串 yywrap:解析一个文件完毕之后,会调用yywrap:返回1表示结束,0表示继续(此时最好重新打开yyin或者重置yyin流)2.几个重要函数:1).yymore():yymore()的含义是,当当前匹配的字串
3、之后,想把后面配置的字串附加到这个字串后面,组成新的token返回. 比如: %% mega- ECHO;yymore(); kludge ECHO; 如果:“mega-kludge"thefollowingwillwrite"mega-mega-kludge"totheoutput。 为什么呢?首先遇到mega-,接着被more了一下,因此就会把kludga附加到mega-后面,而后面的kludge的动作又是打印,因此会打印出:mega
4、-mega-kludge2).yyless():yyless()的含义是:当当前的匹配之后,我想只返回前面几个字符,并且把后面回退到输入 比如: %% foobar ECHO;yyless(3); [a-z]+ ECHO; input"foobar"thefollowingwillwriteout "foobarbar": 为什么呢?foobar输入之后,匹配foobar,ECHO打印出来,接着yyless(3),则输入
5、流变为bar了(yytext为foo).接着再匹配,于是匹配 到[a-z]+,因此再次打印出bar. 3).BEGIN:flex下一个起始解析状态。见第3节,flex的状态.4).REJECT: 相当于拒绝此匹配,让系统重新找下一个匹配。"abcd",it willwrite"abcdabcaba"totheoutput: %% a
6、 ab
7、 abc
8、 abcd
9、ECHO;REJECT; .
10、 /*eatupanyunmatchedcharacter*/ 5).unput(c):把c重新放到输入流。6).input():读取输入流下一个字符7).yyrestart():该函数迫使yylex重新解析。yyrestart有个函数指针流,可以再打开之后,重新使用yyrestart().3.解析源管理: 1).默认是从yyin获取,而yyin则是stdout,也可以是其它文件。 if(!yyin)
11、 yyin=stdin; if(!yyout) yyout=stdout; 2).如果你打开了一个文件,并把yyin指向此文件,则从该文件中读取.比如: 在main中: FILE*fp=NULL; fp=fopen("hell.txt","r"); yyin=fp; 之后再使用 yylex() 则flex从hell.txt中读取信息并解析. 3).从字符串中解析 先使用下列函数,转化缓
12、冲,之后再使用 yylex() a.yy_scan_string(char*).使用了yy_scan_string(char*)之后,flex会把char*放到yy的输入缓冲中(会调用到yy_switch_to_buffer.) b.yy_scan_bytes(constchar*base,intlen); c.yy_scan_buffer(char*base,yy_size_tsize) 这几个函数内部都使用的是缓冲切换的创建等函数,见后面的章节.
此文档下载收益归作者所有