什么是手柄?
句柄是连接文法中产生式规则右侧的子串,其归约到该文法规则左侧的非终结符是与最右侧推导相反的一步。
在每一步寻找处理
可以通过以下过程找到句柄-
它可以从左到右扫描输入字符串,直到遇到第一个.>。
它可以向后扫描直到<。遇到了。
句柄是<之间的字符串。和.>
示例1-考虑语法
E→E+E|E*E|(E)id。
使用运算符优先级解析在每个步骤中查找用于减少字符串id1+id2*id3的句柄。
解决方案
首先,在字符串的开头和结尾附加$,即$id1+id2*id3$。
使用优先关系表放置运算符和符号之间的优先关系。
∴$<.编号1。>+<。编号2>*<。编号3>$
在字符串上应用上述3个步骤。
Example2-在以下语法中计算非终结符E、T和F的第一个和最后一个终结符。
E→E+T|吨
T→T*F|F
F→(E)|ID
解决方案
看到生产,我们可以判断
+是E的第一个终端
*是T的第一个终端
(,id是F的第一个终端。
但是E→T→F
∴F的第一个端点包含在T的第一个端点中,T的第一个端点包含在E的第一个端点中。
∴First(F)={(,id}
∴First(T)=*∪第一个(F)={*,(,id}
First(E)=+∪第(T)={+,*,(,id}
同样,可以找到最后一个终端。
示例3-考虑语法
E→E+T|T
T→T∗F|F
F→(E)|ID
使用运算符优先级解析为字符串id+id*id执行堆栈实现。
解决方案
优先规则<.,.>或=。在栈顶和当前输入符号之间保持。如果栈顶为非终结符,则栈顶之下的终结符将与当前输入符号进行比较。