解析命题逻辑字符串

时间:2016-09-08 20:26:25

标签: javascript arrays parsing logic shunting-yard

我有一个命题逻辑公式

  

((a或b)和!d)或e - > ç

如何解析这个字符串,所以我可以制作一个真值树?

我想我应该按->andor分割我的字符串,但它会弄乱括号。如何在分割字符串之前保护每个括号?在做其他事情之前,我是否可以使用正则表达式拆分括号中的表达式?

对于我的示例中的字符串,我猜它应该创建一个嵌套数组,其中['or', a, b]是“最深”级别,存储在“下一个最深层次”['and', ['or', a, b]]中。所以我的猜测是这个字符串应该转换为数组

[
    'implication'
    [
        'or',
        [
            'and',
            [
                'or',
                'a',
                'b'
            ]
        ],
        'e'
    ],
    'c'
]

其中每个数组由3个元素组成,其中第一个元素告诉操作符,下两个元素告诉操作符应该处理哪些“命题”。

我不确定这是否是一个聪明的结构,但我想这可能是一种解析字符串的方法。

我已经查看了shunting-yard算法,以便从中缀转换为后缀表示法或抽象语法树(AST)。我应该使用这样的东西吗?

1 个答案:

答案 0 :(得分:1)

首先,您应该为命题演算语言定义BNF语法。这很简单。然后,您可以使用它来定义语言的解析器。

请参阅以下有关如何轻松手写递归下降解析器的答案:Is there an alternative for flex/bison that is usable on 8-bit embedded systems?

这个答案还讨论了如何在解析表达式时评估表达式,或者如何将公式保存为“树”并稍后使用不同的变量值对其进行评估。