句柄是连接文法中产生式规则右侧的子串,其归约到该文法规则左侧的非终结符是与最右侧推导相反的一步。
在每一步寻找处理
可以通过以下过程找到句柄-
它可以从左到右扫描输入字符串,直到遇到第一个.>。
它可以向后扫描直到<。遇到了。
句柄是<之间的字符串。和.>
示例1-考虑语法
E→E+E|E*E|(E)id。
使用运算符优先级解析在每个步骤中查找用于减少字符串id1+id2*id3的句柄。
解决方案
首先,在字符串的开头和结尾附加$,即$id1+id2*id3$。
使用优先关系表放置运算符和符号之间的优先关系。
∴$<.编号1。>+<。编号2>*<。编号3>$
在字符串上应用上述3个步骤。
细绳处理生产使用<.id1.>+<.id2.>*<.id3.>$<。编号1。>E→id$E+<。编号2。>*<。编号3。>$<。编号2。>E→id$E+E*<。编号3。>$<。编号3。>E→id$E+E*E$删除所有非终端
$+*$插入运算符之间的优先关系
$<.+<.*。>$<.*.>即,E*EE→E*E$<.+。>$<。+。>即,E+EE→E+E$
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}
同样,可以找到最后一个终端。
非终端第一航站楼最后一个终端F(,ID),id吨*,(,ID*,),id乙+,*,(,id+,*,),id.示例3-考虑语法
E→E+T|T
T→T∗F|F
F→(E)|ID
使用运算符优先级解析为字符串id+id*id执行堆栈实现。
解决方案
优先规则<.,.>或=。在栈顶和当前输入符号之间保持。如果栈顶为非终结符,则栈顶之下的终结符将与当前输入符号进行比较。
堆输入字符串描述$<。id+id*id$$<.身份证,班次身份证$<.id.>+id*id$
$删除所有非终端。因为它们不参与优先关系。$+*.>$插入优先关系$<.+<.*.>$*.>$,减少<.*.>$<.+.>$+。>$,<.+。>是处理,减少<。+。>$
$接受