派生算术表达式?

时间:2011-03-09 00:02:54

标签: parsing math tree

你会如何得出这个表达式?我需要为此绘制一个解析树,但实际上却遇到了麻烦。谷歌搜索也没有提供任何有用的链接,任何帮助将不胜感激,但请简要说明你是如何做到这一点,因为我有很多其他人自己做。是“|”代表“或”运算符就像编程一样?

< exp> ---> < exp> * < factor> | < factor>
< factor> ---> < factor> - < term> | < term>
< term> ---> x | y | z

这是我能想到的最好的,我完全迷失了......

< exp> ---> < exp> * < factor>
---> x * < factor>
---> x * < factor> * < factor>

3 个答案:

答案 0 :(得分:1)

这是一个context-free grammar。 “代数表达式”部分包含一个类似于您想要的示例解析树。

答案 1 :(得分:1)

是的,|或者,就像在常规编程中一样。像这样的一行:

< exp> ---> < exp> * < factor> | < factor>

表示某些内容可以是< exp>,如果它是< exp> * < factor>形式或< factor>

查看完整的语法:

< exp>    ---> < exp> * < factor> | < factor>
< factor> ---> < factor> - < term> | < term>
< term>   ---> x | y | z

x - y * x - y - y * z这样的表达式可以在传递中建立如下:

x        y        x          y        y        z
<term> - <term> * <term>   - <term> - <term> * <term>
<factor>        * <factor> - <term> - <term> * <factor>
<factor>        * <factor>          - <term> * <factor>
<expr>          * <factor>                   * <factor>
<expr>                                       * <factor>
<expr>

撤销订单以获得解析:

          e
         /|\
        / | \
       e  *  f
      /|\     \
     / | \     t
    /  |  \     \
   /   |   \     z
  e    *    f
  |        /|\
  f       / | \
 /|\     f  -  t
f - t   /|\    |
|   |  f - t   y
t   y  |   |
|      t   y
x      |
       x

(那张图比我预期的要多得多;)

答案 2 :(得分:0)

回答你的问题|用于表示编程中的一个或类似的。你发布的语法虽然看起来优先。通常乘法的优先级高于加法,但是你发布的语法却相反,这可能是你问题的一部分。

正确表达式语法的方法(对于你的例子中有限的一组操作)是

expression = expression+ term 
           | term
term       = term * factor
           | factor
factor     = x 
           | y 
           | z

这样,您可以在添加之前进行乘法运算。对于x + y * z,您将拥有以下内容。我不做ASCII艺术,所以你不得不用运算符而不是逗号来定义S-expressions作为分隔符。

(表达式(表达式(因子(因子x)))'+'(术语(因子y)'*'(因子z)))