我正在尝试让 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);
return this.result;
您从未在任何地方设置过
this.result
,因此这将返回 undefined
。我假设您想要返回本地 result
变量的值(与之前在行上打印的值相同),而不是某个字段,因此请剪切 this.
。