假设您要在规则中间添加语义操作,请替换:
S->AB
使用:
S->AMB
M->epsilon { //do something }
为什么这有必要?如果相反我会写下:
会发生什么S->A { //do something } B
答案 0 :(得分:3)
与解析器没有区别 - 在规则中间编写动作是用于通过动作创建新的epsilon规则的语法糖。通过减少解析器来触发操作,因此需要有一个与操作相关联的规则。 Bison会自动为您进行转换。
唯一的区别在于行动中$1
...的含义。使用嵌入式操作,索引计算的值堆栈中的基点将不同 - 基于包含规则的开始而不是epsilon规则。