什么是手柄?
句柄是连接文法中产生式规则右侧的子串,其归约到该文法规则左侧的非终结符是与最右侧推导相反的一步。
在每一步寻找处理
可以通过以下过程找到句柄 -
它可以从左到右扫描输入字符串,直到遇到第一个 .> 。
它可以向后扫描直到 <。遇到了。
句柄是 < 之间的字符串。和 .>
示例 1 - 考虑语法
E → E + E|E * E|(E)id。
使用运算符优先级解析在每个步骤中查找用于减少字符串 id 1 + id 2 * id 3 的句柄。
解决方案
首先,在字符串的开头和结尾附加 $,即 $id 1 + id 2 * id 3 $。
使用优先关系表放置运算符和符号之间的优先关系。
∴ $<. 编号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 * E | E → E * E |
$<. +。> $ | <。+。> 即,E+E | E → 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 $ | < id > 是句柄,id。> +, 减少id, F → id 1 |
$F | <。 | +id * id $ | $<. +, 移 + |
$F + | <。 | id * id $ | + <。身份证,班次身份证 |
$F+<. id | .> | id $ | <。ID 。> 是句柄,将 id 减少到 F,F → id |
$F + F | <。 | id $ | + <.*,移位 * |
$F + F * | <。 | id $ | * <。身份证,班次身份证 |
$F + F *<. id | .> | $ | <。ID 。> 是句柄,将 id 减少到 F,F → id |
$F + F * F | $ | 删除所有非终端。因为它们不参与优先关系。 | |
$+* | .> | $ | 插入优先关系 |
$<. +<.* | .> | $ | * . > $, 减少 <.*. > |
$<. + | .> | $ | + 。> $, <. + 。> 是处理,减少 <。+ 。> |
$ | $ | 接受 |
以上是 什么是手柄? 的全部内容, 来源链接: utcz.com/z/361332.html