【问题标题】:Multiple rules same action in yaccyacc 中的多个规则相同的操作
【发布时间】:2015-08-09 01:00:17
【问题描述】:

如何在yacc中指定多个具有相同动作的规则?

例子:

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

【问题讨论】:

    标签: yacc


    【解决方案1】:

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

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

    如果这些值比 stringint 所暗示的更密切相关,则可以使用词法分析器,例如,通过组合不同类型的数字(整数、浮点点)作为单个令牌类型数字

    【讨论】:

      【解决方案2】:

      这些真的是相同动作吗?也就是说,stringint 是否具有相同的语义类型,或者您是否依赖于 &lt;&lt; 运算符的不同重载?

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多