【发布时间】:2015-08-09 01:00:17
【问题描述】:
如何在yacc中指定多个具有相同动作的规则?
例子:
variable : string {
cout << $1 << endl;
}
| int {
cout << $1 << endl;
}
【问题讨论】:
标签: yacc
如何在yacc中指定多个具有相同动作的规则?
例子:
variable : string {
cout << $1 << endl;
}
| int {
cout << $1 << endl;
}
【问题讨论】:
标签: yacc
这通常在 yacc 中通过定义中间规则来完成。例如
any_value : string
| int
;
variable : any_value {
cout<<$1<<endl;
}
;
如果这些值比 string 和 int 所暗示的更密切相关,则可以使用词法分析器,例如,通过组合不同类型的数字(整数、浮点点)作为单个令牌类型数字。
【讨论】:
这些真的是相同动作吗?也就是说,string 和 int 是否具有相同的语义类型,或者您是否依赖于 << 运算符的不同重载?
在第二种情况下(符号有不同的类型),即使它们具有相同的拼写,动作也并不完全相同,并且没有真正的方法来组合它们。
在第一种情况下,您可以通过在右侧 string | int 中引入额外的产生式来组合动作,然后将动作与新产生式的使用相关联。如果string 和int 是终端,并且您确实不需要在语法中区分它们,那么从扫描仪返回相同的终端可能会更简单。
【讨论】: