Javascript 解析命题逻辑字符串
我有一个命题逻辑公式 ((a或b)和!d)或e->c 怎么可能解析这个字符串,这样我就可以创建一个真值树了 我想我应该用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'
->
,和和或来拆分字符串,但这会弄乱括号。如何在拆分字符串之前保护每个括号?在做任何其他事情之前,我是否应该使用正则表达式按括号中的表达式进行拆分
对于我示例中的字符串,我想它应该创建一个嵌套数组,其中['or',a,b]
是“最深”级别,存储在“下一个最深级别”['and',['or',a,b]]
。所以我猜这个字符串应该被转换成一个数组
[
'implication'
[
'or',
[
'and',
[
'or',
'a',
'b'
]
],
'e'
],
'c'
]
其中每个数组由3个元素组成,其中第一个元素告诉运算符,下两个元素告诉运算符应该处理哪些“命题”
我不确定这是否是一个聪明的结构,但我想这可能是一种解析字符串的方法
我研究了从中缀转换为后缀符号或抽象语法树(AST)的调车场算法。我应该这样做吗?首先,你应该为你的命题演算语言定义一个BNF语法。这很容易。然后,您可以使用它来定义该语言的解析器
关于如何轻松手工编写递归下降解析器,请参见以下答案:
这个答案还讨论了如何在解析表达式时对其求值,或者如何将公式保存为“树”,并在以后使用不同的变量值对其求值