2014-11-10 1 views
0

Мне нужно сделать простой калькулятор (с инфиксным) парсером, который обрабатывает операторы +, -, *,/и float и переменные. Чтобы сделать это, я использовал javacc, и я сделал this grammar с jjtree. Он работает, но не гарантирует, что конечное дерево будет бинарным деревом, которое мне нужно. я хочу что-то вроде 5 * 3 + х-у, чтобы создать следующее дерево:Сделать грамматику калькулятора, которая делает двоичное дерево с javacc

* 
/\ 
5 + 
/\ 
    3 - 
    /\ 
    x y 

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

ответ

0

Что-то вроде следующего даст вам дерево, о котором вы просили.

void sum(): 
{} 
{ 
    term() 
    [ plus() sum() 
    | minus() sum() 
    | times() sum() 
    | divide() sum() 
    | modulo() sum() 
    ] 
} 


void term() : 
{} 
{ 
    "(" sum() ")" | Number() | Variable() 
} 

--- Edit: ---

Чтобы получить дерево, которое отражает приоритет и ассоциативность, вы можете использовать определенные узлы. См. Документацию JJTree.

void sum() #void {} : 
{ 
    term() 
    ( plus() term() #BinOp(3) 
    | minus() term() #BinOp(3) 
    )* 
} 

void term() #void {} : 
{ 
    factor() 
    ( times() factor() #BinOp(3) 
    | divide() factor() #BinOp(3) 
    | modulo() factor() #BinOp(3) 
    )* 
} 

void factor() #void : 
{} 
{ 
    "(" sum() ")" | Number() | Variable() 
} 
+0

Но сохранит ли он приоритет оператора, должен ли я разбирать уравнение в нотации infix? – Maeln

+0

Нет, это не соответствует приоритету оператора. И он не получает права ассоциативности. Это преднамеренно. Если вы посмотрите на дерево примеров в исходном сообщении, вы увидите, что он также не учитывает приоритет оператора и не получает ассоциативности + и - права. См. Править. –

+0

К сожалению, мой плохой, я быстро сделал пример, он должен уважать приоритет оператора, мой плохой. Я пытаюсь [this] (http://stackoverflow.com/a/7867104/1149206), у него нет формального использования грамматики, но он работает очень хорошо для того, чего я пытаюсь достичь. В любом случае спасибо за ваш ответ! – Maeln

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

  • Нет связанных вопросов^_^