Парсинг неоднозначного входа с Antlr

Я пытался в течение нескольких дней проанализировать некоторый текст, который состоит из текста и чисел (я назвал его предложением в моей грамматике).

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

У меня есть правило, которое должно разобрать предложение, которое заканчивается с INT

    sentence_with_int 
        : sentence INT;

Таким образом, если бы у меня был некоторый вход, который был "количеством размера, 14 купленных ботинок равнялись 3" затем sentence_with_int, то был бы подобран не справедливый приговор. Я уверен, что существует лучший способ сделать это, но я просто изучаю инструмент.

Спасибо, Richard

1
задан hippietrail 18 March 2013 в 04:21
поделиться

1 ответ

Ваша грамматика:


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 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'
2
ответ дан 2 September 2019 в 23:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: