首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从逻辑表达式创建AST

从逻辑表达式创建AST
EN

Stack Overflow用户
提问于 2016-09-10 01:00:47
回答 1查看 1.7K关注 0票数 1

我想改信

代码语言:javascript
复制
((a v b) ^ c) v e -> c

转到

代码语言:javascript
复制
[
    'implication'
    [
        'or',
        [
            'and',
            [
                'or',
                'a',
                'b'
            ],
            'c'
        ],
        'e'
    ],
    'c'
]

这怎麽可能?

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

代码语言:javascript
复制
var operators = {
  'v' : 'or',
  '^' : 'and',
  '->': 'implication'
};

然后遍历字符串

代码语言:javascript
复制
// 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 === '(') {
    (...)
  }

  (...)
}

但我不知道如何走得更远。

我猜树形结构数组将使用下面的内容来完成

代码语言:javascript
复制
expression = [operators[token], expression];

因此,表达式被保留,但在数组中处于嵌套级别。

EN

回答 1

Stack Overflow用户

发布于 2016-09-10 02:31:05

参见my SO answer on how to write a parser

使用它,您可以解析表达式,并在解析表达式时输出代码。您可以通过这种方式轻松地生成postfix。

如果您希望生成前缀代码,那么至少在遇到前缀操作之前,您有一种方法可以避免执行输出。为此,解析表达式并构建树;然后按前缀顺序遍历树并输出结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39416466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档