2016-01-16 4 views
-1

Я пытаюсь сделать приложение калькулятора, которое применяет приоритет оператора.Как применить приоритет оператора для калькулятора? Библиотека? Используется ли ANTLR для правильной библиотеки?

Однако я действительно не смог найти четких ссылок на то, как применять его в Java. Я понимаю, что мне, вероятно, придется использовать рекурсивный синтаксический анализатор (если нет другого метода или лучшего способа сделать это). Если да, то лучше ли мне самому закодировать парсер? Или я должен использовать библиотеку.

При просмотре форумов я наткнулся на ответ, который предложил использовать ANTLR, но я считаю, что это похоже на грамматику языка, а не на применение приоритета оператора в выражениях.

Если мне лучше закодировать рекурсивный анализатор спуска, не могли бы вы сослаться на некоторые ссылки о том, как это сделать?

Если я должен использовать библиотеку, не могли бы вы также связать меня с одним из примеров того, как применять приоритет оператора?

Я не совсем уверен, как применять ANTLR для приоритета оператора, и я не видел каких-либо четких ссылок в документах о том, как применять его, что оставляет мне сомнения относительно того, является ли это правильной библиотекой использовать.

Спасибо!

ответ

1

Я не понимаю, почему вы смешиваете ANTLR с приоритетом оператора. ANTLR - это просто синтаксический анализатор (и лексер). Вы можете использовать Bison/Flex для того же результата.

Теперь преимущество, если задается самой грамматике (там может быть какой-то ошибки, я видел пример делает mult '+' mult):

expr: mult '+' expr 
    | mult '-' expr 
    | mult 
    ; 

mult: atom '*' mult 
    | atom '/' mult 
    | atom 
    ; 

atom: T_NUMBER 
    | '(' expr ')' 
    ; 

Эта грамматика почти карту естественно Java кода: каждый правил является функцией получение следующего токена и т. д.

Например, выражение 1 + 2 * 7 будет делать:

rule expr: 
    read token '1' (from rule atom) 
    read '+' read a new expr 
    read '2' (from rule atom) 
    read '*' -> will use rule 'mult'. 
     read '7' (rule atom). 

-> 1 + ((2) * (7)) 

Я не могу объяснить вам логику за что, я узнал, что во Франции 9 лет назад, и я не действительно нужен парсер/лексер.

+0

Я просматривал форумы о том, как применять приоритет оператора и один из ответов, предложенных с использованием ANTLR. Вот почему я не был уверен, правильно ли это использовать или нет. Если не ANTLR, какую библиотеку я должен использовать для применения приоритета оператора? – JavaFanatic

+0

Это не вопрос библиотеки, а больше понимания того, как обеспечить соблюдение приоритета оператора. ANTLR является _simply_ генератором парсера: он выполняет эту работу, но вам все равно придется писать грамматику. – NoDataFound