Я пытался в течение нескольких дней проанализировать некоторый текст, который состоит из текста и чисел (я назвал его предложением в моей грамматике).
sentence options {
greedy=false;
}
: (ANY_WORD | INT)+;
У меня есть правило, которое должно разобрать предложение, которое заканчивается с INT
sentence_with_int
: sentence INT;
Таким образом, если бы у меня был некоторый вход, который был "количеством размера, 14 купленных ботинок равнялись 3" затем sentence_with_int, то был бы подобран не справедливый приговор. Я уверен, что существует лучший способ сделать это, но я просто изучаю инструмент.
Спасибо, Richard
Ваша грамматика:
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'