如何终止野牛无限递归数列?

问题描述 投票:0回答:1

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

我试图产生一种语法,如:

一字一句...字;

但是,我不知道,我应该终止递归序列。无论我直觉地认为我应该把一些终止令牌原因转向冲突。

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

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?

我基本上是试图制造任何被认为是一个字作为顶级解析器生成的链接列表(即希望我可以连接在更高级别的非终端列表,让%start返回一个列表)。

任何帮助将非常感激。

bison yacc
1个回答
1
投票

遇到比其他WORD东西时,递归自然终止;你不需要做任何事情。当然,解析成功,下一个标记必须在word_list的FOLLOW集。

© www.soinside.com 2019 - 2024. All rights reserved.