在解析整个字符串之前,如何让Bison/YACC无法识别命令?

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.

cod*_*eim 2

有时我会通过简化语法来处理这些情况。

在您的情况下,将标记添加到词法分析器中以用于换行符和命令分隔符 (;) 可能是有意义的,这样您就可以显式地将它们放入您的 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)