我是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 。
答案 0 :(得分:1)
ANTLR 4为每个规则生成一个上下文类,用于表示最终解析树中该规则的调用。该名称源自规则名称,因此规则parse
由ParseContext
表示,规则foo
由FooContext
表示。语法生成的ParseContext
类将为您提供访问多种内容的权限,包括以下特定于您的语法的项目。
numbers
返回值将存储在生成的字段ParseContext.numbers
。line()
方法将返回List<LineContext>
,其中包含来自line
的{{1}}规则的每个调用的解析树节点。