【发布时间】:2019-01-31 19:04:29
【问题描述】:
我有一个解析器,它使用 XContext 调用 visitX 方法,其中包含解析为 ArrayNode 和 FunctionName 的表达式。我可以检索函数的对象,并希望为此数组中的每个元素调用它,但该函数需要一个 ExpressionVisitor 和一个 YContext。我可以创建一个新的 YContext(XContext) 并且孩子们按预期是空的。我需要将我的 array.get(i) 作为 TerminalNode 添加到 children 数组中,以便接收 YContext 的函数可以检查孩子的数量 (1),然后获取值(例如,ctx.exprValues().exprList() .expr(0)) 来自 YContext。
TerminalNodeImpl 可以采用 Token(这是一个接口),但我还没有找到一种方法来使用可以采用 JsonNode 值(例如,String、int、Object)的实现类来创建 Token。
YContext 子项是一个 List,但我不确定我可以使用 JsonNode 值构造什么实现 ParseTree。
我尝试使用这样的代码解析 JsonNode 值,但我无法在令牌中获得任何可以使用 addAnyChild 到我的新上下文的东西...
for (int i=0;i<mapArray.size();i++) {
ANTLRInputStream input = new ANTLRInputStream(mapArray.get(i).asText());
MappingExpressionLexer lexer = new MappingExpressionLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
我确定我忽略了一些简单的事情。在其他情况下,我已经能够将值压入堆栈,但在这种情况下,我可以调用的函数都采用 YContext,因此我需要以某种方式将值放入 YContext.children。
【问题讨论】: