代码之家  ›  专栏  ›  技术社区  ›  probably at the beach

用antlr分析不明确的输入

  •  1
  • probably at the beach  · 技术社区  · 14 年前

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

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

    我有一个规则需要解析一个以int结尾的句子

        sentence_with_int 
            : sentence INT;
    

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

    谢谢,李察

    1 回复  |  直到 11 年前
        1
  •  2
  •   Bart Kiers    14 年前

    你的语法:


    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'