Javascript 解析命题逻辑字符串

Javascript 解析命题逻辑字符串,javascript,arrays,parsing,logic,shunting-yard,Javascript,Arrays,Parsing,Logic,Shunting Yard,我有一个命题逻辑公式 ((a或b)和!d)或e->c 怎么可能解析这个字符串,这样我就可以创建一个真值树了 我想我应该用->,和和或来拆分字符串,但这会弄乱括号。如何在拆分字符串之前保护每个括号?在做任何其他事情之前,我是否应该使用正则表达式按括号中的表达式进行拆分 对于我示例中的字符串,我想它应该创建一个嵌套数组,其中['or',a,b]是“最深”级别,存储在“下一个最深级别”['and',['or',a,b]]。所以我猜这个字符串应该被转换成一个数组 [ 'implication'

我有一个命题逻辑公式

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

怎么可能解析这个字符串,这样我就可以创建一个真值树了

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

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

[
    'implication'
    [
        'or',
        [
            'and',
            [
                'or',
                'a',
                'b'
            ]
        ],
        'e'
    ],
    'c'
]
其中每个数组由3个元素组成,其中第一个元素告诉运算符,下两个元素告诉运算符应该处理哪些“命题”

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


我研究了从中缀转换为后缀符号或抽象语法树(AST)的调车场算法。我应该这样做吗?

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

关于如何轻松手工编写递归下降解析器,请参见以下答案:

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