【发布时间】:2026-01-25 01:00:02
【问题描述】:
在我用其他东西替换某些令牌后,有没有办法强制 bison 和/或 flex 重新开始扫描?
我的特定示例是替换特定的单词/字符串。如果我想将hello 的一个词替换为echo hello,我怎样才能得到flex 或bison 来替换hello,然后重新开始解析(选择2 个词而不是一个词)。所以它会是这样的:
- 获取令牌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() 和 yypop_buffer_state() 以及 yy_switch_to_buffer(),但我无法通过继续解析工作来获得“内联”替换......
【问题讨论】:
标签: c parsing bison yacc flex-lexer