制作计算器的语法,用javacc制作二叉树

时间:2014-11-10 15:09:07

标签: parsing calculator grammar javacc

我需要创建一个简单的计算器(带中缀运算符)解析器来处理运算符+, - ,*,/和float和变量。 为了做到这一点,我使用了javacc,并使用jjtree创建了this grammar。它可以工作,但它不能确保最终的树将是一个二叉树,我需要它。 我希望像5 * 3 + x-y这样的东西生成以下树:

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

这样做的正确语法是什么,不会是左递归的?

1 个答案:

答案 0 :(得分:0)

以下内容将为您提供所要求的树。

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


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

---编辑:---

要获得反映优先级和关联性的树,可以使用明确的节点。请参阅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()
}