2012-07-01 136 views
1

我错过了一些基本知识。开始使用ATLR玩弄缺少任何源告诉我如何做到以下几点:ANTLR:解析配置文件

我想解析一个配置文件,我的方案目前在读一个非常丑陋的方式。基本上,它看起来像:

A [Data] [Data] 
B [Data] [Data] [Data] 

其中A/B/...与它们相关联的数据以下(动态量,只有简单的数字)的对象。 一个语法不应该是很难,但现在该怎么使用ANTLR?

  • 仅限词法分析器:A/B是令牌,我要求他读取的令牌。如何问这个问题以及如何检测格式错误的输入?
  • 词法分析器&:A/B是语法规则和......怎么知道成功处理A/B解析器?同一个对象可能会出现在文件中多次,我需要考虑每一个。这更像是在配置文件中列出实例。

编辑: 我的问题是不是语法而是如何得到由语法/词法分析器他们竟然发现/解析告知?最好是:在承认了类似的递归下降规则的调用函数

回答

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();}; 

如果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]}
1

语法应该是这样的(它的伪不ANTLR):

FILE ::= STATEMENT ('\n' STATEMENT)*  
STATEMENT ::= NAME ITEM* 
ITEM = '[' \d+ ']' 
NAME = \w+ 
+0

我的问题是不语法,但是如何通过解析器/词法分析器得到他们实际发现/解析的信息?最好是:在识别像递归下降这样的规则时调用一个函数 – Julian

1

如果你正在寻找方法来执行代码时一些东西被解析,你应该使用动作或AST(在文档中查找它们)。