通过ANTLR分析GUID时出错

通过ANTLR分析GUID时出错,antlr,antlr4,antlrworks,Antlr,Antlr4,Antlrworks,我正试图编写一个语法来解析SQLWHERE子句表达式,但在识别唯一标识符时遇到了词法规则的问题。 我的语法是- 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() { Strin

我正试图编写一个语法来解析SQLWHERE子句表达式,但在识别唯一标识符时遇到了词法规则的问题。 我的语法是-

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行,位置0上的:'4'处出现令牌识别错误”

您已向ANTLR提供了一个正则表达式。但ANTLR不是正则表达式引擎。您需要遵循其语法,其中一些语法如下所述:


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

您已经为ANTLR提供了一个正则表达式。但ANTLR不是正则表达式引擎。您需要遵循其语法,其中一些语法如下所述:


对于初学者,您不希望在开始和结束时使用
^
$
。这些是正则表达式,而不是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
关键字表示这样的规则永远不会用于创建真正的令牌,它只被其他规则使用。另请参见:

锚点
^
$
在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
关键字表示这样的规则永远不会用于创建真正的令牌,它只被其他规则使用。另见: