是否可以从antlr4中的解析器定义的标签中检索列表?
以这个虚拟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
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_];