使用ANTLR 4将文件解析成数组?

时间:2013-07-19 20:34:10

标签: java antlr grammar antlr4

我是ANTLR的新手,我目前正在使用Netbeans IDE 7.3的ANTLRWorks 2插件来显示ANTLR 4.1的语法文件。

我要做的是用一行分隔的美元值解析一个文本文件,然后将它们全部返回到双精度数“double []”的一维数组中。“

例如说我有一个文件values.txt,其中包含:...

12.40
16.91
18.00
17.97
12.85

...我想使用ANTLR生成的** Parser.parseMethod(tokens)*来返回一个数组。所以返回值为{12.4,16.91,18.00,17.85,12.85}

我试图通过这里回答的类似问题 - Antlr Array Help - 来调整我找到的方法,并决定使用列表,从而生成以下代码:

grammar Values;

parse returns [List<Double> numbers]
@init {
  $numbers = new ArrayList<Double>();
}
  :  (line {$numbers.add($line.row);})* EOF
  ;

line returns [Double row]
@init {
  $row = new Double(0.0);
}
  :  (Number {$row = Double.parseDouble($Number.text);})+ (LineBreak | EOF)
  ;

fragment Digit : ('0'..'9')+ ;
Number : Digit '.' Digit ;
Space
  :  (' ' | '\t') -> channel(HIDDEN)
  ;

    LineBreak
  :  '\r'? '\n'
  |  '\r'
  ;

但是一旦生成了这个语法文件,parse()方法就会返回一个“ParseContext”对象......

public final ParseContext parse() throws RecognitionException {...}

...我不知道该怎么用。而且我不知道为什么会创建 ParseContext

1 个答案:

答案 0 :(得分:1)

ANTLR 4为每个规则生成一个上下文类,用于表示最终解析树中该规则的调用。该名称源自规则名称,因此规则parseParseContext表示,规则fooFooContext表示。语法生成的ParseContext类将为您提供访问多种内容的权限,包括以下特定于您的语法的项目。

  • numbers返回值将存储在生成的字段ParseContext.numbers
  • 生成的line()方法将返回List<LineContext>,其中包含来自line的{​​{1}}规则的每个调用的解析树节点。
  • 该类还将包含ANTLR 4侦听器和访问者功能所需的支持方法。