如何解析这种类型的表达式?
问题描述:
我没有编译器的背景,所以我不确定这是否是该领域的一个常见问题。有没有标准的技术来解析这样的表达式? (比如,标签指示深度)如何解析这种类型的表达式?
And
A + B = 1
C + D = 1
Or
P + Q = 1
K = 1
And
Q = 1
R = 2
应该被解析为:我不知道
((A+B=1) AND (C+D=1) AND ((P+Q=1) OR (K=1)) AND ((Q=1) AND (R=2)))
,如果我要再打一个基于堆栈的评价?我目前正在尝试一个,我会发布一个工作代码,如果我可以让它运行。
任何建议在一个简单的方法来实现这个?
答
假设您问的是如何解析由运算符构建的具有不同优先级和关联性的表达式 - 绝对如此。
一种有效的方法称为“自顶向下运算符优先级”,也可能是“运算符优先级”和“优先级爬升”解析。这里有一些很好的来源在详细地解释方法:
真正整洁的事情是它实际需要多少代码。
主要概念是:
前缀VS缀VS mixfix
优先:是
3 + 4 * 5
解析为(3 + 4) * 5
或3 + (4 * 5)
?相关性:是
x - y - z
解析为或(x - y) - z
?
巧合的是,我刚才最近学习这个东西,最终出了关于类似的方法来操作解析,你可以找到here博客写的文章。在我的方法中,我处理中缀,前缀,后缀和mixfix操作符(即? :
);优先级和关联性都在表中指定;我使用堆栈来跟踪其操作数尚未找到的操作符。解析器然后构建一个解析树,其中每个节点都是一个子表达式。
+0
+1谢谢你的链接,我现在正在浏览它们。 – Legend
什么是上下文?它是否必须“安全”?或者你可以稍微改变你的语法,并使用Python与'eval()'或类似的?例如,((A + B == 1)和(C + D == 1))'是Python语法。 –
不幸的是,我无法改变输入。我正在解析一些XML文件,并设法将表达式本身解析为一个字符串。我如何格式化字符串取决于我,但评估顺序仍然需要谨慎。另外,我不想评估任何东西,但想说的是,获取打印字符串。 – Legend
你解析表达式到树?然后通过对这些变量进行数字化来评估它们? – Adrian