如何设置一个字符串到新创建的上下文的孩子

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

我有一个调用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莫名其妙。

string antlr4 children
1个回答
0
投票

该解决方案是旋绕但必要基于表达式是如何定义的。我跟踪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);
            }
© www.soinside.com 2019 - 2024. All rights reserved.