,一种在语法应该是这样的:
parse
: line* EOF
;
line
: (comment | values) (NL | EOF)
;
comment
: ELEMENT+
;
values
: PIPE (ELEMENT PIPE)+
;
PIPE
: '|'
;
ELEMENT
: ('a'..'z')+
;
NL
: '\r'? '\n' | '\r'
;
WS
: (' '|'\t') {$channel=HIDDEN;}
;
,并测试它,你只需要撒一些代码在你的语法是这样的:
grammar Route;
@members {
List<List<String>> values = new ArrayList<List<String>>();
}
parse
: line* EOF
;
line
: (comment | v=values {values.add($v.line);}) (NL | EOF)
;
comment
: ELEMENT+
;
values returns [List<String> line]
@init {line = new ArrayList<String>();}
: PIPE (e=ELEMENT {line.add($e.text);} PIPE)*
;
PIPE
: '|'
;
ELEMENT
: ('a'..'z')+
;
NL
: '\r'? '\n' | '\r'
;
WS
: (' '|'\t') {$channel=HIDDEN;}
;
现在通过调用生成词法分析器/解析器:
java -cp antlr-3.2.jar org.antlr.Tool Route.g
创建一个类RouteTest.java
:
import org.antlr.runtime.*;
import java.util.List;
public class RouteTest {
public static void main(String[] args) throws Exception {
String data =
"a comment\n"+
"| xxxxx | y | zzz |\n"+
"another comment\n"+
"| a | abc | b | def |";
ANTLRStringStream in = new ANTLRStringStream(data);
RouteLexer lexer = new RouteLexer(in);
CommonTokenStream tokens = new CommonTokenStream(lexer);
RouteParser parser = new RouteParser(tokens);
parser.parse();
for(List<String> line : parser.values) {
System.out.println(line);
}
}
}
编译所有源文件:
javac -cp antlr-3.2.jar *.java
和运行类RouteTest
:
// Windows
java -cp .;antlr-3.2.jar RouteTest
// *nix/MacOS
java -cp .:antlr-3.2.jar RouteTest
如果一切顺利的话,你看这打印到控制台:
[xxxxx, y, zzz]
[a, abc, b, def]
编辑:请注意,我通过只允许小写字母来简化它,您可以随时扩展套餐。
欢迎来到SO!小提示:您应该用4个空格缩进代码,这会导致该站点解析并显示为代码,这可以通过突出显示块并按顶部的“代码”按钮或点击Ctrl + K来完成。 – RCIX 2010-01-26 22:49:35
谢谢,这是我第一次发布Stack Overflow,感谢热烈的欢迎。 – Ben 2010-01-26 23:06:19