【问题标题】:Using ANTLR 4 to parse file into an array?使用 ANTLR 4 将文件解析为数组?
【发布时间】:2013-07-19 20:34:09
【问题描述】:

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

【问题讨论】:

    标签: java antlr grammar antlr4


    【解决方案1】:

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

    • numbers 返回值将存储在生成的字段ParseContext.numbers
    • 生成的line() 方法将返回一个List&lt;LineContext&gt;,其中包含每次从parse 调用line 规则的解析树节点。
    • 该类还将包含 ANTLR 4 侦听器和访问者功能正常工作所需的支持方法。

    【讨论】:

      猜你喜欢
      • 2011-01-17
      • 2016-11-09
      • 2013-10-19
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多