g*********s 发帖数: 1782 | 1 在一个程序里反复调用yyparse()的时候,第一次调用出错后,之后所有的调用都出错
,即使后面的文件是正取的。看上去是buffer没有flush/reset。
放狗搜了一下,看上去这篇文章最靠谱。但是怎么在程序里调用YY_FLUSH_BUFFER啊?
这个是flex自己生成的macro。
http://olympus.het.brown.edu/cgi-bin/info2www?(bison)How+Can+I+Reset+the+Parser |
c*****t 发帖数: 1879 | 2 你找错方向了。
一般来说,跟 lexer 没关系。你最多改下 input 的 source 和 dfa state (回到
initial)而已。
至于 parser,我建议你仔细读下 bison 里面的 error handling 。里面讲的比较详
细。你要做的是 clear token stack 和 lookahead / error flag 。
【在 g*********s 的大作中提到】 : 在一个程序里反复调用yyparse()的时候,第一次调用出错后,之后所有的调用都出错 : ,即使后面的文件是正取的。看上去是buffer没有flush/reset。 : 放狗搜了一下,看上去这篇文章最靠谱。但是怎么在程序里调用YY_FLUSH_BUFFER啊? : 这个是flex自己生成的macro。 : http://olympus.het.brown.edu/cgi-bin/info2www?(bison)How+Can+I+Reset+the+Parser
|
g*********s 发帖数: 1782 | 3 老大,原理明白了,再详细指点一下吧。又搜了半天,也看了bison的手册,还是没找
到具体操作。瞎猜了几个方案试了试,还是没解决问题。:(
【在 c*****t 的大作中提到】 : 你找错方向了。 : 一般来说,跟 lexer 没关系。你最多改下 input 的 source 和 dfa state (回到 : initial)而已。 : 至于 parser,我建议你仔细读下 bison 里面的 error handling 。里面讲的比较详 : 细。你要做的是 clear token stack 和 lookahead / error flag 。
|
g*********s 发帖数: 1782 | 4 误打误撞,问题居然解决了。
第一个文件有个/*,但没有匹配的*/,就一直找到文件尾,然后报错返回。
下面这个方案经过验证可行:
<> {printf("unfinished comments when file ends\n"); YY_FLUSH_
BUFFER; BEGIN INITIAL; }
但对flex/bison这套错误处理机制还是不太清楚。
【在 g*********s 的大作中提到】 : 老大,原理明白了,再详细指点一下吧。又搜了半天,也看了bison的手册,还是没找 : 到具体操作。瞎猜了几个方案试了试,还是没解决问题。:(
|