Antlr4 访问者(JavaScript)返回 udefine 数组

问题描述 投票:0回答:1

我正在尝试让 antlr4 访问者,它将从我的树返回自定义结果。我实现了这些功能:

export default class GrammarParserVisitor extends MyGrammarParserVisitor {
  // Visit a parse tree produced by MyGrammarParser#formula.
  visitFormula(ctx) {
    let result = [];

    for (let i = 0; i < ctx.getChildCount(); i++) {
      result.push(this.visit(ctx.getChild(i)));
    }

    return result;
  }

  visitFunction(ctx) {
    let result = [ctx.FUNCTION_NAME().getText()];

    const expressionList = ctx.expression();

    for (let i = 0; i < expressionList.length; i++) {
      console.log("FUNC ARGS", expressionList[i].getText());
      result.push(this.visit(expressionList[i]));
    }

    console.log(result);

    return this.result;
  }

当我在访问函数方法中执行

console.log(result);
时,我得到
[ 'IF', [ undefined ], [ [ [Array] ] ], [ [ [Array] ] ] ]

但访问者返回结果后我得到

[ undefined, [ [ [Array] ] ], undefined ]
如何在没有未定义结果的情况下从访问者返回结果?

语法部分

formula : ST expression EOF;
function
    :   FUNCTION_NAME OPEN_ROUND_BRACKET (expression (COMMA expression)*)? CLOSE_ROUND_BRACKET
    ;

和带有输入字符串的index.js

const formula = "=IF($I$11=D169,1,0)";
var chars = new InputStream(formula, true);
var lexer = new MyGrammarLexer(chars);
var tokens = new CommonTokenStream(lexer);
var parser = new MyGrammarParser(tokens);
const tree = parser.formula();

const visitor = new GrammarParserVisitor();

let res = visitor.visitFormula(tree);

console.log(tree.toStringTree(parser.ruleNames));
console.log(res);
antlr antlr4
1个回答
0
投票
return this.result;

您从未在任何地方设置过

this.result
,因此这将返回
undefined
。我假设您想要返回本地
result
变量的值(与之前在行上打印的值相同),而不是某个字段,因此请剪切
this.

© www.soinside.com 2019 - 2024. All rights reserved.