我需要创建一个简单的计算器(带中缀运算符)解析器来处理运算符+, - ,*,/和float和变量。 为了做到这一点,我使用了javacc,并使用jjtree创建了this grammar。它可以工作,但它不能确保最终的树将是一个二叉树,我需要它。 我希望像5 * 3 + x-y这样的东西生成以下树:
*
/ \
5 +
/ \
3 -
/ \
x y
这样做的正确语法是什么,不会是左递归的?
答案 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()
}