首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >通过ANTLR解析GUID时出错

通过ANTLR解析GUID时出错
EN

Stack Overflow用户
提问于 2016-11-16 20:30:45
回答 2查看 384关注 0票数 1

我试图写一个语法来解析SQL where子句表达式,并且面临着识别唯一标识符的词法规则的问题。我的语法是这样的-

代码语言:javascript
代码运行次数:0
运行
复制
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
          ;

我要解析的代码是-

代码语言:javascript
代码运行次数:0
运行
复制
    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

EN

回答 2

Stack Overflow用户

发布于 2016-11-16 21:39:09

您已经为ANTLR提供了一个正则表达式。但ANTLR不是正则表达式引擎。您需要遵循它的语法,这里描述了其中的一些语法:https://github.com/antlr/antlr4/blob/master/doc/grammars.md

对于初学者来说,您不希望在开始和结束时使用^$。这些是正则表达式,而不是ANTLR。

票数 0
EN

Stack Overflow用户

发布于 2016-11-16 22:38:00

锚点^$在ANTLR中无效。此外,{...}不受ANTLR支持。

你想要做的是:

代码语言:javascript
代码运行次数:0
运行
复制
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?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40632247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档