我已经尝试了几天来解析一些由文本和数字组成的文本(我在语法中称它为句子)。
sentence options {
greedy=false;
}
: (ANY_WORD | INT)+;
我有一条规则,需要解析一个以INT
结束的句子 sentence_with_int
: sentence INT;
因此,如果我有一些输入是“14买的鞋子的数量是3”,那么sentence_with_int将匹配而不仅仅是句子。我确信有更好的方法可以做到这一点,但我只是在学习这个工具。
谢谢,理查德
答案 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'