我有一个调用visitX法包含解析为ArrayNode和FunctionName表达式中的XContext解析器。我可以检索功能的对象,并要拨打对其调用这个数组中的每个元素,但该功能需要一个ExpressionVisitor和YContext。我可以创建一个新的YContext(XContext)和孩子都是空的预期。我需要我的array.get(I)添加为TerminalNode到孩子阵列,因此函数接收YContext可以检查孩子的(1)的数量,然后获取值(例如,ctx.exprValues()。exprList() .expr(0))从YContext。
TerminalNodeImpl可以采取令牌(这是一个接口),我还没有找到一种方法使用,可以采取一个JsonNode值(例如,字符串,整数,Object)将实现类来创建令牌。
该YContext孩子是一个列表,但我不知道什么工具分析树,我可以建立基于JsonNode值。
我试图解析使用这样的代码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莫名其妙。
该解决方案是旋绕但必要基于表达式是如何定义的。我跟踪CTX被传递给函数,所以我可以得到它的结构:
Function_callContext:
---------------------
TerminalNodeImpl $string 44 '$string'
ExprValuesContext
TerminalNodeImpl ( 2 '('
ExpressionListContext
NumberContext
TerminalNodeImpl 1 22 '1'
TerminalNodeImpl ) 3 ')'
TerminalNodeImpl $string 44 '$string'
Because the parser is looking for:
expr :
...
| VAR_ID exprValues # function_call
...
;
...
exprList : expr (',' expr)* ;
exprValues : '(' exprList ')' ;
VAR_ID : '$' ID ;
ID : [a-zA-Z] [a-zA-Z0-9_]*;
而且我发现CommonTokenFactory让我创建令牌我可以把在TerminalNodeImpl这样我就可以建立正确的上下文。
下面是代码(我只实现了NUMBER在这一点上,但之后会添加异常和其他类型的...我的测试是转换数字数组来使用$映射的字符串数组([1..5] $字符串)的例子(其中,[1..5]是成为阵列的序列。
for (int i = 0; i < mapArray.size(); i++) {
Function_callContext callCtx = new Function_callContext(ctx);
// note: callCtx.children should be empty unless carrying an
// exception
ExprListContext elc = new ExprListContext(callCtx.getParent(),callCtx.invokingState);
ExprValuesContext evc = new ExprValuesContext(callCtx.getParent(),callCtx.invokingState);
evc.addAnyChild(new TerminalNodeImpl(CommonTokenFactory.DEFAULT.create(MappingExpressionParser.T__1,"(")));
CommonToken token = null;
JsonNode element = mapArray.get(i);
switch (element.getNodeType()) {
case ARRAY: {
break;
}
case BINARY:
break;
case BOOLEAN:
break;
case MISSING:
break;
case NULL:
break;
case NUMBER:
token = CommonTokenFactory.DEFAULT.create(MappingExpressionParser.NUMBER,element.asText());
TerminalNodeImpl tn = new TerminalNodeImpl(token);
NumberContext nc = new NumberContext(callCtx);
nc.addAnyChild(tn);
elc.addAnyChild(nc);
evc.addAnyChild(elc);
break;
case OBJECT:
break;
case POJO:
break;
case STRING:
break;
default:
break;
}
evc.addAnyChild(new TerminalNodeImpl(CommonTokenFactory.DEFAULT.create(MappingExpressionParser.T__1,")")));
callCtx.addAnyChild(var);
callCtx.addAnyChild(evc);
result = function.invoke(this, callCtx);
resultArray.add(result);
}