计算无上下文语法的前导和尾随集

时间:2015-02-08 18:33:30

标签: context-free-grammar formal-languages

我正在寻找一个详细的算法,描述如何在无上下文语法中为非终端符号生成前导和尾随集。

我发现了这样的事情: https://pl.scribd.com/doc/51358638/16/Operator-Precedence-Relations 但我不确定它是如何工作的。 (见第20页)

假设我们有制作:

  

A - > YaZ |乙

     

B - > B'/ P>

然后,据说,前导(A)= {a},前导(A)=前导(B)和前导(B)= {b}。 我对此表示怀疑:

  1. 是否意味着,领导(A)= {a,b}? - 我假设在每一步中我们都不会因为'='而替换已经生成的集合,而是将两个集合相加。
  2. 是否意味着,领导(B)是{b}还是{a,b}? - 第三条规则是否意味着我们将领先(B)添加到领导(A)或领导(A)和领导(B)是等同的?

2 个答案:

答案 0 :(得分:7)

LeadingTrailing是特定于生成运算符优先级解析器的函数,仅当您具有运算符优先级语法时才适用。运算符优先语法是运算符语法的特例,运算符语法具有 no production没有两个连续的非终端的重要属性。

(松散地说,运算符优先语法是一个运算符语法,可以用运算符优先级解析器解析:-)。但现在这并不重要。)

给定一个运算符语法,非终端的函数Leading(resp。Trailing)产生一组终端,这些终端可以(递归地)在第一个(相应的最后一个)终端中非终端的生产。

另一种方法是,如果终端在生产开始时是“可见的”,那么终端就位于非终端的前导集中。我们认为非终端是“透明的”,因此可以通过非终端或通过查看可见的非终端来看到终端。

例如,标准表达式语法(运算符语法;没有生产有两个连续的非终端):

expr   -> factor '*' expr
expr   -> factor
factor -> term '+' factor
factor -> term
term   -> ID
term   -> '(' expr ')'

term开始,ID(从一开始就可见,ID)从最后可见。任何一方都看不到expr,因为它被终端隐藏,所以我们不需要考虑它。

factor开始,+从两端都可见,而factor也会继承term的前导和尾随集,因为从term可以看到factor结束。 (expr本身也是可见的,但是不能向尾随集添加任何新内容。)

最后,从*开始,expr从两端都可见,factor继承自Non-terminal Leading Trailing expr *, +, ID, ( *, +, ID, ) factor +, ID, ( +, ID, ) term ID, ( ID, )

所以我们最终得到:

nonterminal TERMINAL

由此,我们将构建优先关系。基本上,如果你找到了

TRAIL ⋗ TERMINAL

在任何作品中,然后为TRAIL中的每个Trailing(nonterminal)添加优先关系TERMINAL nonterminal 。同样,每次出现

TERMINAL ⋖ LEAD

LEAD中的每个Leading(nonterminal)生成关系TERMINAL1 TERMINAL2 。最后,如果你找到了

TERMINAL1 nonterminal TERMINAL2

TERMINAL1 ·=· TERMINAL2

然后您生成关系T, U

生成所有优先关系后,您会查看每对终端T ⋖ U, T ⋗ U, T ·=· U。如果最多只有一个优先关系成立 - 即T或者没有UT, U之间的关系 - 那么你就有一个运算符优先级语法。 (U, T和{{1}}之间没有联系。优先关系不是反对称的,不幸的是它们传统上拼写的符号看起来像数字比较。)

答案 1 :(得分:1)

领先(A)= {a,b},因为:

  1. A-> YaZ,'a'是第一个终端;
  2. A-> B和B-> b,因此: i)Leading(B)中的b(b是集合Leading(B)的元素),并且 ii)Leading(B)属于Leading(A)(Leading(B)是Leading(A)的子集)。

也就是说,A => * YaZ和A => * b,所以{a,b} = Leading(A)。