我正在寻找一个详细的算法,描述如何在无上下文语法中为非终端符号生成前导和尾随集。
我发现了这样的事情: https://pl.scribd.com/doc/51358638/16/Operator-Precedence-Relations 但我不确定它是如何工作的。 (见第20页)
假设我们有制作:
A - > YaZ |乙
B - > B'/ P>
然后,据说,前导(A)= {a},前导(A)=前导(B)和前导(B)= {b}。 我对此表示怀疑:
答案 0 :(得分:7)
Leading
和Trailing
是特定于生成运算符优先级解析器的函数,仅当您具有运算符优先级语法时才适用。运算符优先语法是运算符语法的特例,运算符语法具有 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
或者没有U
到T, U
之间的关系 - 那么你就有一个运算符优先级语法。 (U, T
和{{1}}之间没有联系。优先关系不是反对称的,不幸的是它们传统上拼写的符号看起来像数字比较。)
答案 1 :(得分:1)
领先(A)= {a,b},因为:
也就是说,A => * YaZ和A => * b,所以{a,b} = Leading(A)。