2012-07-01 130 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(在文檔中查找它們)。