使用Antlr解析模糊输入

时间:2010-06-19 03:01:43

标签: antlr antlr3 ambiguity

我已经尝试了几天来解析一些由文本和数字组成的文本(我在语法中称它为句子)。

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

我有一条规则,需要解析一个以INT

结束的句子
    sentence_with_int 
        : sentence INT;

因此,如果我有一些输入是“14买的鞋子的数量是3”,那么sentence_with_int将匹配而不仅仅是句子。我确信有更好的方法可以做到这一点,但我只是在学习这个工具。

谢谢,理查德

1 个答案:

答案 0 :(得分: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();
    }
}

首先生成一个解析器& lexer(假设所有文件和ANTLR jar都在同一目录中):

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'