我缺少一些基本知识。今天开始玩ATLR,没有任何消息来源告诉我如何执行以下操作:
我想解析一个配置文件,我的程序目前以非常丑陋的方式读取。基本上它看起来像:
A [Data] [Data]
B [Data] [Data] [Data]
其中A / B / ...是跟随其关联数据的对象(动态数量,仅简单数字)。 语法不应该那么难,但现在如何使用ANTLR?
修改: 我的问题不是语法,而是如何通过解析器/词法分析器获得实际发现/解析的内容?最好的方法是:在识别像递归下降的规则时调用函数
答案 0 :(得分:2)
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();};
如果你下面的课程:
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]}
答案 1 :(得分:1)
语法应该是这样的(它的伪代码不是ANTLR):
FILE ::= STATEMENT ('\n' STATEMENT)*
STATEMENT ::= NAME ITEM*
ITEM = '[' \d+ ']'
NAME = \w+
答案 2 :(得分:1)
如果您正在寻找解析某些内容时执行代码的方法,您应该使用操作或AST(在文档中查找它们)。