[英]How do I get yacc/bison and/or lex/flex to restart scanning after something like token substitution?
在用其他东西代替某些令牌后,是否有办法强迫野牛和/或flex重新开始扫描?
我的特定示例是替换特定的单词/字符串。 如果我想的话hello
要被替换echo hello
,我怎样才能得到弯曲或野牛更换hello
,然后再次开始解析(拿起2个字,而不只是一个)。 就像这样:
hello
,请将令牌值替换为echo hello
echo hello
) echo
) hello
) 我见过非常诱人的功能,例如yyrestart()
,但我并不真正了解该功能的真正作用。 非常感谢任何帮助,谢谢!
更新4/23/2010
我最终使用的一种破解和斜线解决方案是针对出现的每个word
,我检查一个“别名”数组。 如果word
有别名,我将替换单词的值(例如,使用strcopy($1,aliasval)
),并标记一个aliasfound
标志。
一旦对整个输入行进行了一次解析,如果aliasfound
标志为true,我将使用yy_scan_string()
将缓冲区状态切换为具有扩展别名的输入,并调用YYACCEPT
。
因此,它跳到了主函数,我再次调用yyparse()
,缓冲区仍然指向我的字符串。 一直持续到找不到别名为止。 完成所有语法操作后,我将调用yyrestart(stdin)
返回“正常”模式。
如果有人知道我如何才能有效地扩展其单词的别名值,将其注入stdin
(或其他方法),并且基本上随便扩展所有别名(甚至嵌套),那就太好了。 我在玩yypush_buffer_state()
和yypop_buffer_state()
以及yy_switch_to_buffer()
,但是在继续解析工作的过程中,我无法获得“内联”替换...
在我看来,解决此问题的地方是词法分析器。 我建议使用flex,它支持状态机(在flex文档中称为“ 开始条件 ”)。 您可以使用BEGIN
更改状态,并且需要在定义部分中定义状态。
因此,例如,您可能有一条规则
<INITIAL>hello BEGIN(in_echo); yyless(0); return (WORD_ECHO);
<in_echo>hello BEGIN(0); return (WORD_HELLO);
yyless()
将yytext
截断为给定的值,因此这会将整个输入放回流中。
我自己还没有尝试过,但是我认为这是您想要的解决方案的结构。
根据最终结果添加“答案”。 希望将此问题标记为已回答。
更新4/23/2010
我最终使用的一种破解和斜线解决方案是针对出现的每个单词,我检查一个“别名”数组。 如果单词有别名,则替换单词的值(例如,使用strcopy($ 1,aliasval)),并标记一个aliasfound标志。
一旦对整个输入行进行了一次解析,如果aliasfoundfound标志为true,那么我将使用yy_scan_string()将缓冲区状态切换为具有扩展别名的输入,然后调用YYACCEPT。
因此,它跳到了主函数,我再次调用yyparse(),缓冲区仍然指向我的字符串。 一直持续到找不到别名为止。 完成所有语法操作后,我将调用yyrestart(stdin)返回“正常”模式。
如果有人知道我如何才能有效地扩展其单词的别名值,将其注入stdin(或其他方法),并且基本上随便扩展所有别名(甚至嵌套),那就太好了。 我当时在玩yypush_buffer_state()和yypop_buffer_state()以及yy_switch_to_buffer(),但是在继续解析工作的过程中我无法获得“内联”替换...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.