【问题标题】:JavaCC - How can I make order not matter in this statement?JavaCC - 如何在此声明中使订单无关紧要?
【发布时间】:2014-10-16 22:07:43
【问题描述】:

我基本上有以下语句,并且希望它以相同的方式对待里面的东西,无论它以什么顺序出现。所以例如,目前的代码是,它将接受“ABS(5)+ 3”但是不是“3 + ABS(5)”。有谁知道我怎样才能让它按任何顺序工作?

我认为将所有内容都设为 OR,然后用 * 包围它会起作用,但这似乎并没有太大的区别。

( ( s1=ABS() { s=s+s1; } )
| ( "+" { op="+"; s=s+op; }
  | "-" { op="-"; s=s+op; }
  | "*" { op="*"; s=s+op; }
  | "/" { op="/"; s=s+op; } ) 
| ( s1=EXPR() { s=s+s1; } ) )*

【问题讨论】:

    标签: compiler-construction javacc


    【解决方案1】:

    我认为你几乎是在正确的轨道上。您希望 ABS 可以是一种 EXPR,那么您的复合表达式规则可以是

    s = EXPR()
    (
        (
          "+" { op="+"; s=s+op; } 
        | "-" { op="-"; s=s+op; } 
        | "*" { op="*"; s=s+op; }
        | "/" { op="/"; s=s+op; }
        )
        s1=EXPR() { s=s+s1; }
    )*
    

    EXPR 的主体看起来像

    ( s = ABS() | s = NUMBER() )
    {return s;}
    

    正如 EJP 在他们的回答中指出的那样,这不涉及运算符优先级,但不清楚这是一个直接目标。此外,您所说的 Expr 通常称为 Primary。看 Parsing Expressions by Recursive Descent 了解更多关于优先级和关联性的信息。

    【讨论】:

      【解决方案2】:

      基本上,你做错了。表达式语法应该与任何其他语言一样,expression, term, factor,primary.ABS() 这样的函数调用应该出现在 primary 的产生式中,除了文字,'(' expression ')' 等等.

      【讨论】:

        猜你喜欢
        • 2023-03-15
        • 1970-01-01
        • 1970-01-01
        • 2016-05-11
        • 2021-12-06
        • 1970-01-01
        • 1970-01-01
        • 2013-09-01
        • 2018-09-21
        相关资源
        最近更新 更多