Как получить результат оценки из выражения парсера при использовании antlr 3?

Я использую ANTLR 3.5. Я хотел бы построить грамматику, которая оценивает логические выражения, такие как

x=true;
b=false;
c=true;
a=x&&b||c;

и вернуть результат оценки с помощью вызова Java (например, ExprParser.eval() из приведенной выше записи вернет true.)

Буду ждать примера.


person florins    schedule 29.05.2013    source источник
comment
antlr.org/wiki/display/ANTLR3/Expression+evaluator имеют посмотрите на этот образец. Он выводит результаты на консоль, а не возвращает их, и использует другие операторы, но идея примерно та же.   -  person Iarek    schedule 30.05.2013
comment
@Ярослав Спасибо за ответ. Я следовал этому примеру, но до сих пор не понимаю, как получить результат оценки из вызова Java. В принципе, из примера я хотел бы, чтобы вызов parser.prog(); возвращал оценку выражения, означающего int result=parser.prog();   -  person florins    schedule 04.06.2013
comment
prog() ссылается на список выражений, некоторые из них могут возвращать значение. Вы хотите получить только последний или все результаты?   -  person Iarek    schedule 04.06.2013


Ответы (1)


Вы можете сделать что-то вроде следующего (используя контекст грамматики , на которую я ссылался в комментарии к вопросу):

Прежде всего, объявите элемент для хранения последнего результата оценки:

@members {
    private int __value;
}

Затем устанавливайте его всякий раз, когда вы что-то вычисляете

stat:   expr NEWLINE { __value = $expr.value; } | // rest of the stat entry

И, наконец, верните его, когда все stat будут вычислены:

// will return 0 if no expr blocks were evaluated
public prog returns [int value]:   stat+ {$value = __value;};

В C# я использовал немного другой подход — добавлял событие в парсер и вызывал его, когда можно было вычислить результат выражения. Клиент может подписаться на это событие и получать все результаты вычислений.

@members
{ 
    public event Action<int> Computed;
}

stat:   expr NEWLINE  { Computed($expr.value); }
person Iarek    schedule 04.06.2013