2010-06-19 48 views
1

我一直在嘗試解析一些由文本和數字組成的文本(我在文法中稱它爲一個句子)。用Antlr解析模糊輸入

sentence options { 
      greedy=false; 
    } 
     : (ANY_WORD | INT)+; 

我有一個需要解析與INT

sentence_with_int 
     : sentence INT; 

所以,如果我有一些投入,這是「14點的鞋子買大小數爲3」,然後sentence_with_int完成句子的規則將不僅僅匹配句子。我確信有更好的方法來做到這一點,但我只是在學習這個工具。

謝謝,理查德

回答

2

你的語法:


grammar Test; 

sentence_with_int 
    : sentence {System.out.println("Parsed: sentence='"+$sentence.text+"'");} 
    INT  {System.out.println("Parsed: int='"+$INT.text+"'");} 
    ; 

sentence 
    : (ANY_WORD | INT)+ 
    ; 

ANY_WORD 
    : ('a'..'z' | 'A'..'Z')+ 
    ; 

INT 
    : ('0'..'9')+ 
    ; 

WS 
    : (' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;} 
    ; 

正是這麼做的。這裏有一個小測試工具:

import org.antlr.runtime.*; 

public class Demo { 
    public static void main(String[] args) throws Exception { 
     ANTLRStringStream in = new ANTLRStringStream("the number of size 14 shoes bought was 3"); 
     TestLexer lexer = new TestLexer(in); 
     CommonTokenStream tokens = new CommonTokenStream(lexer); 
     TestParser parser = new TestParser(tokens); 
     parser.sentence_with_int(); 
    } 
} 

首先生成一個解析器&詞法分析器(假設所有的文件,以及ANTLR罐子,都在同一個目錄):

 
java -cp antlr-3.2.jar org.antlr.Tool Test.g 

和編譯所有.java源文件:

 
javac -cp antlr-3.2.jar *.java 

最後運行Demo類:

 
java -cp .:antlr-3.2.jar Demo 

產生以下輸出(在Windows ,具有;更換:):

 
Parsed: sentence='the number of size 14 shoes bought was' 
Parsed: int='3' 
+0

非常感謝巴特! – 2010-06-19 07:48:59

+0

沒問題@Richard,儘管我沒有做太多的事情:你的語法開頭很好! :) – 2010-06-19 08:20:29