2010-06-19 83 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