通过ANTLR解析GUID时出错
问题描述:
我正在尝试编写一个解析SQL where子句表达式的语法,并且面临用词法规则识别唯一标识符的问题。 我的语法是喜欢 -通过ANTLR解析GUID时出错
grammar Sample;
UID: '^[A-Za-z0-9]{8}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{12}$';
literal_value :
UID
;
而我的代码来解析是 -
public void compile() {
String expression = "4B66049D-6E1A-4CE6-8FBF-B31CD8B9E6AF"
ANTLRInputStream input = new ANTLRInputStream(expression);
SampleLexer lexer = new SampleLexer(input);
final CommonTokenStream tokens = new CommonTokenStream(lexer);
SampleParser parser = new SampleParser(tokens);
SampleParser.Literal_valueContext context = parser.literal_value();
System.out.println(context.toStringTree());
}
但我得到的错误 - 异常解析表达式:1号线4“‘:’令牌识别错误的” ,位置0
答
你给ANTLR一个正则表达式。但ANTLR不是一个正则表达式引擎。您需要按照它的语法,其中一些在这里描述:https://github.com/antlr/antlr4/blob/master/doc/grammars.md
对于初学者来说,你不希望在开始和结束^
和$
。那些是正则表达式的东西,而不是ANTLR的东西。
答
锚点^
和$
在ANTLR中无效。此外,ANTLR不支持{...}
。
你想要做的是这样的:
grammar Sample;
literal_value
: UID EOF
;
UID
: BLOCK BLOCK '-' BLOCK '-' BLOCK '-' BLOCK '-' BLOCK BLOCK BLOCK
;
fragment BLOCK
: [A-Za-z0-9] [A-Za-z0-9] [A-Za-z0-9] [A-Za-z0-9]
;
的EOF
是一个内置的令牌类型,这并不奇怪,表示文件($
锚)结束。而关键字fragment
表示这样的规则永远不会用于创建真实的令牌,它只能被其他规则使用。另见:What does "fragment" mean in ANTLR?