Javascript 从逻辑表达式创建AST
我想皈依Javascript 从逻辑表达式创建AST,javascript,parsing,logic,abstract-syntax-tree,postfix-notation,Javascript,Parsing,Logic,Abstract Syntax Tree,Postfix Notation,我想皈依 ((a v b) ^ c) v e -> c 进入 这怎么可能 我想我应该先定义一些操作符(操作符类型对应于操作符符号) 然后穿过绳子 // string var infix = '((a v b) ^ c) v e -> c'; // remove spaces, so infix[i]!=" " infix = infix.replace(/\s+/g, ''); // traverse through string for (let i=0; i<infi
((a v b) ^ c) v e -> c
进入
这怎么可能
我想我应该先定义一些操作符(操作符类型对应于操作符符号)
然后穿过绳子
// string
var infix = '((a v b) ^ c) v e -> c';
// remove spaces, so infix[i]!=" "
infix = infix.replace(/\s+/g, '');
// traverse through string
for (let i=0; i<infix.length; i++) {
// get token
var token = infix[i];
// if token is an operator
if (operators.indexOf(token) !== -1) {
(...)
}
// if token is parenthesis
else if (token === '(') {
(...)
}
(...)
}
因此表达式被保留,但位于数组中的嵌套级别。请参阅
使用它,您可以解析表达式,并在解析表达式时吐出代码。您可以通过这种方式轻松生成后缀
如果要生成前缀代码,那么至少在遇到前缀操作之前,可以避免执行输出。为此,,
解析表达式并构建树;然后按前缀顺序遍历树并说出结果。请参阅
使用它,您可以解析表达式,并在解析表达式时吐出代码。您可以通过这种方式轻松生成后缀
如果要生成前缀代码,那么至少在遇到前缀操作之前,可以避免执行输出。为此,,
解析表达式并构建树;然后按前缀顺序遍历树,并吐出结果。请仔细阅读,但它会以后缀形式给出结果。然后如何将其转换为嵌套数组关键是它将基于优先级对其进行解析。从这里开始,将其放入嵌套数组是很简单的。每当您完成对给定运算符及其操作数的解析时,都会将它们放入数组中。除非这是一个旨在教授语法分析理论的学校项目(在这种情况下,我希望会有更多的指导),否则最好的选择是使用jison。只需使用逻辑运算符调整标准算术解析器。不要在这里重复问同一个问题。请仔细阅读,但它会以后缀形式给出结果。然后如何将其转换为嵌套数组关键是它将基于优先级对其进行解析。从这里开始,将其放入嵌套数组是很简单的。每当您完成对给定运算符及其操作数的解析时,都会将它们放入数组中。除非这是一个旨在教授语法分析理论的学校项目(在这种情况下,我希望会有更多的指导),否则最好的选择是使用jison。只需使用逻辑运算符调整标准算术解析器。不要在这里重复问同一个问题。我已经读过你的答案,但恐怕我不明白。我不理解代码片段,也不知道如何将其用于简单的命题逻辑。我猜我的BNF语言被定义为
p::=p | ~p | ^ | v |->
,但我不知道如何在你的例子中使用它你的BNF是不正常的。首先,它没有显示操作数与运算符的关系。通常表达式语言允许使用括号;你的没有,这似乎很可疑。找一个小表达式langauge的例子,重写你的,然后用另一个定义回来。如果您想帮助定义您的BNF,请开始另一个SO问题。我已经阅读了您的答案,但恐怕我不明白。我不理解代码片段,也不知道如何将其用于简单的命题逻辑。我猜我的BNF语言被定义为p::=p | ~p | ^ | v |->
,但我不知道如何在你的例子中使用它你的BNF是不正常的。首先,它没有显示操作数与运算符的关系。通常表达式语言允许使用括号;你的没有,这似乎很可疑。找一个小表达式langauge的例子,重写你的,然后用另一个定义回来。如果您想要帮助定义您的BNF,请开始另一个SO问题。
var operators = {
'v' : 'or',
'^' : 'and',
'->': 'implication'
};
// string
var infix = '((a v b) ^ c) v e -> c';
// remove spaces, so infix[i]!=" "
infix = infix.replace(/\s+/g, '');
// traverse through string
for (let i=0; i<infix.length; i++) {
// get token
var token = infix[i];
// if token is an operator
if (operators.indexOf(token) !== -1) {
(...)
}
// if token is parenthesis
else if (token === '(') {
(...)
}
(...)
}
expression = [operators[token], expression];