chu*_*son 5 c parsing yacc 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); }
;
Run Code Online (Sandbox Code Playgroud)
我想知道我怎么让Bison不接受(YYACCEPT?)的东西command直到它读取所有输入.所以我可以在下面使用所有这些规则来使用递归或任何构建的东西,这会导致有效的命令或不起作用的东西.
我正在使用上面的代码进行的一个简单测试就是输入"cd mydir mydir".野牛解析CD并且WORD"嘿!这是一个命令,把它放到顶部!".然后它找到的下一个标记就是WORD,它没有规则,然后报告错误.
我希望它读取整行并意识到CD WORD WORD不是规则,然后报告错误.我想我错过了一些明显的东西,非常感谢任何帮助 - 谢谢!
此外 - 我尝试使用input command NEWLINE或类似的东西,但它仍然CD WORD作为一个命令推到顶部,然后分别解析额外的WORD.
有时我会通过简化语法来处理这些情况。
在您的情况下,将标记添加到词法分析器中以用于换行符和命令分隔符 (;) 可能是有意义的,这样您就可以显式地将它们放入您的 Bison 语法中,这样解析器将在接受命令之前期望命令的完整行输入命令。
sep: NEWLINE | SEMICOLON
;
command: CD sep
| CD WORD sep
;
Run Code Online (Sandbox Code Playgroud)
或者,对于像真实 shell 一样的任意参数列表:
args:
/* empty */
| args WORD
;
command:
CD args sep
;
Run Code Online (Sandbox Code Playgroud)