ANTLR:解析配置文件

时间:2012-07-01 18:15:27

标签: java antlr

我缺少一些基本知识。今天开始玩ATLR,没有任何消息来源告诉我如何执行以下操作:

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

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

其中A / B / ...是跟随其关联数据的对象(动态数量,仅简单数字)。 语法不应该那么难,但现在如何使用ANTLR?

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

修改: 我的问题不是语法,而是如何通过解析器/词法分析器获得实际发现/解析的内容?最好的方法是:在识别像递归下降的规则时调用函数

3 个答案:

答案 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(在文档中查找它们)。