【问题标题】:Make a calculator's grammar that make a binary tree with javacc制作一个计算器的语法,用 javacc 制作一棵二叉树
【发布时间】:2014-11-11 21:40:36
【问题描述】:

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

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

什么是合适的语法来做到这一点,而不是左递归?

【问题讨论】:

    标签: parsing calculator grammar javacc


    【解决方案1】:

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

    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()
    }
    

    【讨论】:

    • 但它会保留运算符优先级吗,我是否正在用中缀符号解析方程?
    • 不,它不尊重运算符优先级。它也没有正确的关联性。这是故意的。如果您查看原始帖子中的示例树,您会发现它也不尊重运算符优先级,并且它没有获得 + 和 - 的关联性。见编辑。
    • 哎呀,我的错,我很快就完成了这个例子,它应该尊重运算符优先级,我的错。我正在尝试this,它没有正式使用语法,但它对于我想要实现的目标非常有效。无论如何感谢您的回答!
    • 看看编辑,JJTree 旨在让您构建您想要的树。
    猜你喜欢
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 2021-08-24
    • 2017-01-28
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    相关资源
    最近更新 更多