【发布时间】:2016-03-24 13:13:41
【问题描述】:
我知道递归下降解析器使用的语法有两种类型的限制。
- 语法不能有任何左递归产生式
- 语法不能要求多于标记前瞻。
我理解第一个,但对第二个限制有点迷茫。为什么这个限制是必要的,没有它,生产甚至可以存在吗?
【问题讨论】:
标签: java compiler-construction grammar left-recursion
我知道递归下降解析器使用的语法有两种类型的限制。
我理解第一个,但对第二个限制有点迷茫。为什么这个限制是必要的,没有它,生产甚至可以存在吗?
【问题讨论】:
标签: java compiler-construction grammar left-recursion
第二个限制可以通过要求解析器可以根据第一个 k 标记(而不是基于单个标记)决定使用哪个产品来稍微放宽。这允许对此类语法进行高效(即线性时间)解析算法(请参阅Recursive descent parser)。
在实践中选择k=1 的主要原因似乎是LL(1) 语法的解析器更容易构造。显然,许多计算机语言被设计为由LL(1) 语法生成。见LL parser。
由产生式S -> A | B、A -> a A b | eps 和B -> a B b b | eps 组成的文法是非歧义非LL(1) 文法的一个示例,因为解析器无法根据单个标记决定使用哪个产生式。 (取自here。)
【讨论】:
S -> A | B、A -> a A b | eps 和 B -> a B b b | eps 组成的文法是非歧义非 LL(1) 文法的一个示例,因为解析器无法决定使用哪个产生式在一个令牌上。 (取自here。)