,一種在語法應該是這樣的:
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