繁体   English   中英

这是LL(1)语法吗?

[英]Is this grammar LL(1)?

我得到了以下语法:

S -> a | aT
T -> b | bR
R -> cb | cbR

我知道,为了使语法成为LL(1),它必须是无歧义的和右递归的。 问题是我不完全理解左递归和右递归语法的概念。 我不知道以下语法是否正确递归。 我非常希望对左递归语法和右递归语法的概念做一个简单的解释,如果我的语法是LL(1)。

非常感谢。

该语法不是LL(1)。 在LL(1)解析器中,应该始终有可能基于当前的非终结符和输入的下一个标记来确定下一个要使用的生产。

让我们看一下这个产品,例如:

S→a |

现在,假设我告诉您当前的非终止符号为S,输入的下一个符号为a。 您能确定要使用哪种产品? 不幸的是,如果没有更多的上下文,您将无法这样做:也许您假设使用S→a,也许您应该使用S→aT。 使用类似的推理,您可以看到所有其他产品都具有类似的问题。

这与左递归或右递归无关,而是这样的事实,即LL(1)语法中同一非终结符的任何两个产生式都不能具有非空的公共前缀。 实际上,检查语法是否不是 LL(1)的一种简单启发式方法是看是否可以找到两个这样的生成规则。

希望这可以帮助!

语法只有一个递归规则:最后一个规则,其中R是左侧的符号,也出现在右侧。 它是右递归的,因为在语法规则中,R是最右边的符号。 该规则引用R,该引用最右边。

语言是LL(1)。 我们所知道的是,我们可以轻松地构造不使用回溯且最多使用一个前瞻标记的递归下降解析器。

但是这样的解析器将基于语法的略微修改版本。

例如,两个产品: S -> aS -> a T可以合并为一个可以由EBNF S -> a [ T ] S得出a ,后跟可选T )。 该规则可以由用于识别S的单个解析函数处理。

该函数与a匹配,然后寻找可选​​的T ,它将由下一个输入符号b

我们可以按照以下方式为此编写LL(1)语法:

S -> a T_opt
T_opt -> b R_opt
T_opt -> <empty>
... et cetera

通过使T (我们将其重命名为T_opt )能够导出空字符串,然后将其压缩为S的单个规则,来显式处理T的可选性,这样我们就不会有两个都以a开头的短语。

因此,总而言之,语言是LL(1),但给定的语法不是。 由于语言为LL(1),因此可以找到另一种语法为LL(1),并且该语法与给定的语法相距不远。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM