我试图写一个语法来解析SQL where子句表达式,并且面临着识别唯一标识符的词法规则的问题。我的语法是这样的-
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());
}
但是我得到了错误异常解析表达式:'token recognition error at:‘4’on line 1,position 0
发布于 2016-11-16 13:39:09
您已经为ANTLR提供了一个正则表达式。但ANTLR不是正则表达式引擎。您需要遵循它的语法,这里描述了其中的一些语法:https://github.com/antlr/antlr4/blob/master/doc/grammars.md
对于初学者来说,您不希望在开始和结束时使用^
和$
。这些是正则表达式,而不是ANTLR。
发布于 2016-11-16 14:38:00
锚点^
和$
在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?
https://stackoverflow.com/questions/40632247
复制相似问题