选项superClass=...
是用来让你的Parser
扩展自定义类。所以,我不认为这就是你所追求的。
里面的一切@header
部分将放置在您的开头Parser
班级。这用于导入类:
@header {
import java.io.PrintWriter;
}
注意@header {...}
是缩写@parser::header {...}
。您还可以定义:@lexer::header {...}
为你的词法分析器。
还有里面@member {...}
(or: @parser::member {...}
, @lexer::member {...}
)部分,您可以添加可在以下任一内部使用的实例变量和方法:Parser
or Lexer
:
@header {
import java.io.PrintWriter;
}
@members {
PrintWriter writer;
}
一个语法的小演示,其解析器会将解析后的数字写入特定的写入器:
grammar T;
@header {
import java.io.PrintWriter;
}
@members {
PrintWriter writer;
public TParser(TokenStream input, String fileName) {
super(input);
try {
writer = new PrintWriter(fileName);
} catch(Exception e) {
e.printStackTrace();
}
}
}
parse
: numbers EOF
;
numbers
: (NUM {
writer.println("parsed: " + $NUM.text);
writer.flush();
}
)+
;
NUM : '0'..'9'+;
WS : ' ' {skip();};
可以用以下方法进行测试:
import java.io.File;
import org.antlr.runtime.*;
public class Main {
public static void main(String[] args) throws Exception {
String source = "42 500000000 666";
TLexer lexer = new TLexer(new ANTLRStringStream(source));
TParser parser = new TParser(new CommonTokenStream(lexer), "log.txt");
parser.parse();
}
}
如果运行上面的类,会生成一个名为log.txt
已创建包含:
parsed: 42
parsed: 500000000
parsed: 666
请注意,所有这些都有严格的顺序@...
and options {...}
等实例:
-
grammar
定义
-
options
块(无@
sign!)
-
tokens
块(无@
sign!)
-
@header
block
-
@members
block
grammar T;
options {
// options here
}
tokens {
// imaginary tokens here
}
@header {
// ...
}
@members {
// ...
}
EDIT
ANTLRStarter 写道: