1

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

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

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

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

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

编辑:我的问题不是语法,而是如何通过解析器/词法分析器了解他们实际发现/解析的内容?最好的办法是:在识别递归下降之类的规则时调用一个函数

4

3 回答 3

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]}
于 2012-07-01T18:49:50.837 回答
1

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

FILE ::= STATEMENT ('\n' STATEMENT)*    
STATEMENT ::= NAME ITEM*
ITEM = '[' \d+ ']'
NAME = \w+
于 2012-07-01T18:29:24.140 回答
1

如果您正在寻找在解析某些内容时执行代码的方法,您应该使用操作或 AST(在文档中查找它们)。

于 2012-07-01T18:37:41.763 回答