多个规则在yacc中执行相同的操作

时间:2015-05-27 05:41:18

标签: yacc

如何在yacc中指定具有相同操作的多个规则 例如:

variable : string { cout<<$1<<endl; } | int { cout<<$1<<endl; }

2 个答案:

答案 0 :(得分:5)

这通常通过定义中间规则在yacc中完成。例如

any_value : string
      | int
      ;
variable  : any_value { 
        cout<<$1<<endl; 
      }
      ;

如果值与 string int 所隐含的值更密切相关,则可以使用词法分析器,例如,通过组合不同类型的数字(整数,浮动) point)作为单个令牌类型 number

答案 1 :(得分:1)

这些是相同的动作吗?也就是说,stringint具有相同的语义类型,还是您依赖于<<运算符的不同重载?

在第二种情况下(符号具有不同的类型),即使它们具有相同的拼写,动作也不是真的相同,并且没有真正的方法来组合它们。

在第一种情况下,您可以通过引入带有右侧string | int的额外制作,然后将操作与新制作的使用相关联来组合这些操作。如果stringint是终端,并且您实际上不需要在语法中区分它们,那么从扫描仪返回相同的终端可能更简单。