如何在yacc中指定具有相同操作的多个规则 例如:
variable : string {
cout<<$1<<endl;
}
| int {
cout<<$1<<endl;
}
答案 0 :(得分:5)
这通常通过定义中间规则在yacc中完成。例如
any_value : string
| int
;
variable : any_value {
cout<<$1<<endl;
}
;
如果值与 string 和 int 所隐含的值更密切相关,则可以使用词法分析器,例如,通过组合不同类型的数字(整数,浮动) point)作为单个令牌类型 number 。
答案 1 :(得分:1)
这些是相同的动作吗?也就是说,string
和int
具有相同的语义类型,还是您依赖于<<
运算符的不同重载?
在第二种情况下(符号具有不同的类型),即使它们具有相同的拼写,动作也不是真的相同,并且没有真正的方法来组合它们。
在第一种情况下,您可以通过引入带有右侧string | int
的额外制作,然后将操作与新制作的使用相关联来组合这些操作。如果string
和int
是终端,并且您实际上不需要在语法中区分它们,那么从扫描仪返回相同的终端可能更简单。