gpt4 book ai didi

c - 如何让 Bison/YACC 在解析整个字符串之前不识别命令?

转载 作者:太空狗 更新时间:2023-10-29 15:06:34 27 4
gpt4 key购买 nike

我有一些 Bison 语法:

input: /* empty */
| input command
;

command:
builtin
| external
;

builtin:
CD { printf("Changing to home directory...\n"); }
| CD WORD { printf("Changing to directory %s\n", $2); }
;

我想知道如何让 Bison 在读取所有输入之前不接受(YYACCEPT?)某些东西作为 command。因此,我可以在下面使用所有这些规则,这些规则使用递归或任何东西来构建东西,这要么导致有效命令,要么导致无法正常工作。

我用上面的代码做的一个简单测试就是输入“cd mydir mydir”。 Bison 解析 CDWORD 并说“嘿!这是一个命令,把它放到顶部!”。然后它找到的下一个标记就是 WORD,它没有规则,然后报告错误。

我想让它读整行,意识到CD WORD WORD不是规则,然后报错。我想我遗漏了一些明显的东西,非常感谢任何帮助 - 谢谢!

另外 - 我试过使用 input command NEWLINE 或类似的东西,但它仍然将 CD WORD 作为命令推到顶部,然后解析额外的 WORD 分开。

最佳答案

有时我通过扁平化我的语法来处理这些情况。

在您的情况下,为换行符和命令分隔符 (;) 添加标记到您的词法分析器可能是有意义的,这样您就可以将它们明确地放入您的 Bison 语法中,因此解析器将期望在命令之前输入完整的一行接受命令。

sep:   NEWLINE | SEMICOLON
;

command: CD sep
| CD WORD sep
;

或者,对于像真实 shell 这样的任意参数列表:

args:
/* empty */
| args WORD
;

command:
CD args sep
;

关于c - 如何让 Bison/YACC 在解析整个字符串之前不识别命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2601381/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com