JavaCC - Как я могу сделать порядок неважным в этом заявлении?

У меня в основном есть следующий оператор, и я хочу, чтобы он обрабатывал содержимое внутри одного и того же, независимо от того, в каком порядке он идет. Так, например, в текущем коде он будет принимать «ABS (5) + 3», но не «3». + АБС (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; } ) )*

person smritz    schedule 16.10.2014    source источник


Ответы (2)


Я думаю, вы почти на правильном пути. Если вы хотите, чтобы 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, обычно называют первичным. См. Анализ выражений по рекурсивному спуску для получения дополнительной информации о приоритете и ассоциативности.

person Theodore Norvell    schedule 17.10.2014

По сути, вы делаете это совершенно неправильно. Грамматика выражений должна быть такой же, как и для любого другого языка, с expression, term, factor, и primary. Вызовы функций, такие как ABS(), должны появляться в продукции для primary и больше нигде, вместе с литералами, '(' expression ')' и так далее.

person user207421    schedule 16.10.2014