作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一些 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 解析 CD
和 WORD
并说“嘿!这是一个命令,把它放到顶部!”。然后它找到的下一个标记就是 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/
我是一名优秀的程序员,十分优秀!