我有一个命题逻辑公式
((a或b)和!d)或e - > ç
如何解析这个字符串,所以我可以制作一个真值树?
我想我应该按->
,and
和or
分割我的字符串,但它会弄乱括号。如何在分割字符串之前保护每个括号?在做其他事情之前,我是否可以使用正则表达式拆分括号中的表达式?
对于我的示例中的字符串,我猜它应该创建一个嵌套数组,其中['or', a, b]
是“最深”级别,存储在“下一个最深层次”['and', ['or', a, b]]
中。所以我的猜测是这个字符串应该转换为数组
[
'implication'
[
'or',
[
'and',
[
'or',
'a',
'b'
]
],
'e'
],
'c'
]
其中每个数组由3个元素组成,其中第一个元素告诉操作符,下两个元素告诉操作符应该处理哪些“命题”。
我不确定这是否是一个聪明的结构,但我想这可能是一种解析字符串的方法。
我已经查看了shunting-yard算法,以便从中缀转换为后缀表示法或抽象语法树(AST)。我应该使用这样的东西吗?
答案 0 :(得分:1)
首先,您应该为命题演算语言定义BNF语法。这很简单。然后,您可以使用它来定义语言的解析器。
请参阅以下有关如何轻松手写递归下降解析器的答案:Is there an alternative for flex/bison that is usable on 8-bit embedded systems?
这个答案还讨论了如何在解析表达式时评估表达式,或者如何将公式保存为“树”并稍后使用不同的变量值对其进行评估。