Compiler construction JavaCC-我如何才能在这个语句中确定不重要的顺序?

Compiler construction JavaCC-我如何才能在这个语句中确定不重要的顺序?,compiler-construction,javacc,Compiler Construction,Javacc,我基本上有下面的陈述,并且希望它能以同样的方式对待里面的东西,不管它的顺序如何。因此,例如,正如代码当前所示,它将接受ABS5+3,但不接受3+ABS5。有人知道我怎样才能使它以任何顺序工作吗 我原以为把所有的东西都放在或的位置,然后用*围绕着它会起作用,但这似乎并没有什么不同 ( ( s1=ABS() { s=s+s1; } ) | ( "+" { op="+"; s=s+op; } | "-" { op="-"; s=s+op; } | "*" { op="*"; s=s+op; }

我基本上有下面的陈述,并且希望它能以同样的方式对待里面的东西,不管它的顺序如何。因此,例如,正如代码当前所示,它将接受ABS5+3,但不接受3+ABS5。有人知道我怎样才能使它以任何顺序工作吗

我原以为把所有的东西都放在或的位置,然后用*围绕着它会起作用,但这似乎并没有什么不同

( ( 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; } ) )*

基本上,你完全错了。表达式语法应该与任何其他语言一样,包括表达式、术语、因子和基本语法。像ABS这样的函数调用应该出现在primary的产品中,而不是其他产品中,以及文本、表达式等等。

我认为您的思路基本正确。如果你希望ABS可以是一种表达式,那么你的复合表达式规则可以是

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。看见 有关优先级和关联性的详细信息