是否可以从antlr4中的解析器定义的标签中检索列表?

是否可以从antlr4中的解析器定义的标签中检索列表?,antlr,antlr4,Antlr,Antlr4,以这个虚拟antlr4语法为例: grammar testingGrammar; @header{package gen;} dsopt_rename: 'rename' (OLDN=ID '=' NEWN=ID)+; ID: [a-zA-Z_]; 我的目标是java。我想得到两个列表:旧名字和新名字;可以这样做: @Override public DsOption visitDsopt_rename(Dsopt_renameContext ctx) { LinkedList

以这个虚拟antlr4语法为例:

grammar testingGrammar;
@header{package gen;}

dsopt_rename: 'rename' (OLDN=ID '=' NEWN=ID)+;
ID: [a-zA-Z_];
我的目标是java。我想得到两个列表:旧名字和新名字;可以这样做:

@Override
public DsOption visitDsopt_rename(Dsopt_renameContext ctx) {    
    LinkedList<String> oldNames = new LinkedList<String>();
    LinkedList<String> newNames = new LinkedList<String>();
    for (int i=0; i < ctx.ID().size(); ++i) {
        LinkedList<String> rename = (i%2 == 1) ? oldNames : newNames;
        rename.add(ctx.ID(i).getText());
    }
    return new DsOptRename(oldNames, newNames);
}
但它可能很容易出错,因为oldn和newn可以进行无关联的匹配


谢谢你的时间

使用
+=
符号收集代币:

语法测试语法; dsopt_重命名 :“重命名”(lhs+=ID'='rhs+=ID)+ ; ID:[a-zA-Z_]; 空格:[\t\r\n]+->跳过; 像这样测试它:

@Override
public DsOption visitDsopt_rename(Dsopt_renameContext ctx) {    
    LinkedList<String> oldNames = new LinkedList<String>();
    LinkedList<String> newNames = new LinkedList<String>();
    for (int i=0; i < ctx.ID().size(); ++i) {
        LinkedList<String> rename = (i%2 == 1) ? oldNames : newNames;
        rename.add(ctx.ID(i).getText());
    }
    return new DsOptRename(oldNames, newNames);
}
String source=“重命名a=ab=bc=c”;
testingGrammarLexer lexer=新的testingGrammarLexer(CharStreams.fromString(source));
testingGrammarParser解析器=新的testingGrammarParser(新的CommonTokenStream(lexer));
testingGrammarParser.Dsopt_rename econtext ctx=parser.Dsopt_rename();
列表lhsTokens=ctx.lhs;
列表rhsTokens=ctx.rhs;
System.out.printf(“lhsTokens=%s\nrhsTokens=%s\n”,lhsTokens,rhsTokens);
将打印:

lhsTokens=[@1,7:7='a',1:7],@4,13:13='b',1:13],@7,19:19='c',1:19]]
rhsTokens=[@3,11:11='A',1:11],@6,17:17='B',1:17],@9,23:23='C',1:23]]
更多信息:

grammar testingGrammar;
@header{package gen;}

dsopt_rename: 'rename' (oldn '=' newn)+;
oldn: ID;
newn: ID;
ID: [a-zA-Z_];