如何终止Bison中的无限递归序列?

时间:2019-02-04 00:40:54

标签: bison yacc

我是Bison的新手,正在努力理解如何表示“一个或多个”或“零个或多个”(即正则表达式中的+和*)。

我正在尝试产生一种语法:

  

单词word ...单词;

但是,我不确定应该在哪里终止递归序列。我凭直觉认为应该在任何地方放置一些终结符,从而引起转移冲突。

到目前为止,我已经成功创建了语法:

word_list 
    : word { printf("parsed first word: %s\n", $1); }
    | word_list word { printf("parsed following: %s\n", $2); };

word : WORD { $$ = $1; }

这几乎是我想要的地方:

输入this is something; 输出

parsed first word: this
parsed following: is
parsed following: something

如果我继续输入内容,它将始终采用| word_list word的路径,那么,从本质上讲,我该如何指定一个令牌来打破此递归?

我是否需要随后将word_list包装在另一个为其指定终止顺序的非终端字符中?

我本质上是在尝试生成一个链表,该链表是作为顶级解析器生成的,被视为 word (即希望我可以将列表连接在更高级别的非终端程序上,让%start返回一个列表)。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

当遇到.bat以外的内容时,递归自然结束。您无需执行任何操作。当然,要使解析成功,下一个标记必须位于WORD的FOLLOW集中。