你会如何得出这个表达式?我需要为此绘制一个解析树,但实际上却遇到了麻烦。谷歌搜索也没有提供任何有用的链接,任何帮助将不胜感激,但请简要说明你是如何做到这一点,因为我有很多其他人自己做。是“|”代表“或”运算符就像编程一样?
< exp> ---> < exp> * < factor> | < factor>
< factor> ---> < factor> - < term> | < term>
< term> ---> x | y | z
这是我能想到的最好的,我完全迷失了......
< exp> ---> < exp> * < factor>
---> x * < factor>
---> x * < factor> * < factor>
答案 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)))