Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从逻辑表达式创建AST_Javascript_Parsing_Logic_Abstract Syntax Tree_Postfix Notation - Fatal编程技术网

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];