1

我对 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

4

1 回答 1

1

ANTLR 4 为每个规则生成一个上下文类,用于表示在最终解析树中对该规则的调用。名称派生自规则名称,因此规则parse由 表示ParseContext,规则foo由 表示FooContext。由您的语法生成的ParseContext课程将为您提供一些内容,包括以下特定于您的语法的项目。

  • 返回值将numbers存储在生成的字段中ParseContext.numbers
  • 生成的line()方法将返回一个List<LineContext>包含每次调用来自 的line规则的解析树节点parse
  • 该类还将包含 ANTLR 4 侦听器和访问者功能工作所需的支持方法。
于 2013-07-20T01:14:24.407 回答