2016-11-16 69 views
1

我正在尝试编写一个解析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

回答

0

你给ANTLR一个正则表达式。但ANTLR不是一个正则表达式引擎。您需要按照它的语法,其中一些在这里描述:https://github.com/antlr/antlr4/blob/master/doc/grammars.md

对于初学者来说,你不希望在开始和结束^$。那些是正则表达式的东西,而不是ANTLR的东西。

0

锚点^$在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?