ANTLR生产规则可以有返回值(一个或多个),你可以用它来获得您的配置文件的内容。
这里有一个快速演示:
grammar T;
parse returns [java.util.Map<String, List<Integer>> map]
@init{$map = new java.util.HashMap<String, List<Integer>>();}
: (line {$map.put($line.key, $line.values);})+ EOF
;
line returns [String key, List<Integer> values]
: Id numbers (NL | EOF)
{
$key = $Id.text;
$values = $numbers.list;
}
;
numbers returns [List<Integer> list]
@init{$list = new ArrayList<Integer>();}
: (Num {$list.add(Integer.parseInt($Num.text));})+
;
Num : '0'..'9'+;
Id : ('a'..'z' | 'A'..'Z')+;
NL : '\r'? '\n' | '\r';
Space : (' ' | '\t')+ {skip();};
如果RUNT以下类:
import org.antlr.runtime.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
String input = "A 12 34\n" +
"B 5 6 7 8\n" +
"C 9";
TLexer lexer = new TLexer(new ANTLRStringStream(input));
TParser parser = new TParser(new CommonTokenStream(lexer));
Map<String, List<Integer>> values = parser.parse();
System.out.println(values);
}
}
以下将被打印到控制台:
{A=[12, 34], B=[5, 6, 7, 8], C=[9]}
我的问题是不语法,但是如何通过解析器/词法分析器得到他们实际发现/解析的信息?最好是:在识别像递归下降这样的规则时调用一个函数 – Julian