从逻辑表达式创建AST

时间:2016-09-09 17:00:47

标签: javascript parsing logic abstract-syntax-tree postfix-notation

我想转换

((a v b) ^ c) v e -> c

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

这怎么可能?

我想我应该从定义一些运算符开始(运算符类型对应于运算符符号)

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

所以表达式被保留但是在数组的嵌套级别上。

1 个答案:

答案 0 :(得分:0)

请参阅my SO answer on how to write a parser

使用此方法,您可以解析表达式,并在解析表达式时吐出代码。您可以通过这种方式轻松生成后缀。

如果要生成前缀代码,那么至少在遇到前缀操作之前,您可以避免输出。去做这个, 解析表达式并构建一棵树;然后以前缀顺序遍历树并吐出结果。