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