2014-10-16 6 views
0

У меня в основном есть следующее утверждение и хочу, чтобы он обрабатывал материал внутри него независимо от того, в каком порядке он входит. Так, например, в качестве кода в настоящее время он будет принимать «ABS (5) + 3», но не «3 + ABS (5)». Кто-нибудь знает, как я могу заставить его работать в любом порядке?JavaCC - Как я могу сделать заказ неважно в этом заявлении?

Я думал о том, чтобы положить все как 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; }))* 

ответ

0

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

0

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

Смежные вопросы