在我用其他东西替换一些令牌后,有没有办法强制 bison 和/或 flex 重新开始扫描?
我的特定示例是替换特定的单词/字符串。如果我想hello
用 替换一个词,echo hello
我怎样才能让 flex 或 bison 替换hello
然后重新开始解析(选择 2 个词而不是一个词)。所以它会像:
- 获取token WORD(字符串类型)
- 如果
hello
,将令牌值替换为echo hello
- 重新开始解析整个输入(现在是
echo hello
) - 获取令牌 WORD (
echo
) - 获取令牌 WORD (
hello
)
我见过非常诱人的函数yyrestart()
,比如 非常感谢任何帮助,谢谢!
2010 年 4 月 23 日更新
我最终使用的一种 hack-and-slash 解决方案是针对每个word
通过的,我检查一个“别名”数组。如果word
有别名,我会替换单词的值(例如,使用strcopy($1,aliasval)
),并标记一个aliasfound
标志。
一旦整行输入被解析一次,如果aliasfound
标志为真,我会使用yy_scan_string()
扩展别名将缓冲区状态切换到输入,然后调用YYACCEPT
.
然后它跳到主函数,我yyparse()
再次调用,缓冲区仍然指向我的字符串。这一直持续到找不到别名为止。一旦我所有的语法动作都完成了,我就会打电话yyrestart(stdin)
回到“正常”模式。
如果有人知道我如何使用它们的别名值有效地扩展我的单词,注入stdin
(或其他方法),并在我进行时基本上扩展所有别名(甚至嵌套),那就太棒了。我正在玩yypush_buffer_state()
and yypop_buffer_state()
,以及yy_switch_to_buffer()
,但是我无法通过继续解析工作来获得“内联”替换......