我是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
返回一个列表)。
任何帮助将不胜感激。
答案 0 :(得分:1)
当遇到.bat
以外的内容时,递归自然结束。您无需执行任何操作。当然,要使解析成功,下一个标记必须位于WORD
的FOLLOW集中。