String Antlr字符串不匹配

String Antlr字符串不匹配,string,antlr,antlr3,String,Antlr,Antlr3,我正在解决一个小问题。在我的小型定制DSL中,我希望能够在字段之间执行比较操作。我有三个字段类型(String、Int、Identifier),标识符是一个变量名。我制定了一个大规格,但我已经把我的问题缩小到了一个更小的语法 问题是,当我尝试使用字符串语法表示法(您可以使用antlrworks将其添加到语法中)时,我的字符串被视为标识符。这是我的语法: grammar test; x : 'FROM' field_value EOF ; field_value : S

我正在解决一个小问题。在我的小型定制DSL中,我希望能够在字段之间执行比较操作。我有三个字段类型(String、Int、Identifier),标识符是一个变量名。我制定了一个大规格,但我已经把我的问题缩小到了一个更小的语法

问题是,当我尝试使用字符串语法表示法(您可以使用antlrworks将其添加到语法中)时,我的字符串被视为标识符。这是我的语法:

grammar test;

x
    : 'FROM' field_value EOF
    ;

field_value
    : STRING
    | INT
    | identifier
    ;

identifier
    : ID (('.' '`' ID '`')|('.' ID))?
    | '`' ID '`' (('.' '`' ID '`')|('.' ID))?
    ;

ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
    ;

INT :   '0'..'9'+
    ;

STRING
    :  '"' ( ESC_SEQ | ~('\\'|'"') )* '"'
    ;

fragment
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;

fragment
ESC_SEQ
    :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
    |   UNICODE_ESC
    |   OCTAL_ESC
    ;

fragment
OCTAL_ESC
    :   '\\' ('0'..'3') ('0'..'7') ('0'..'7')
    |   '\\' ('0'..'7') ('0'..'7')
    |   '\\' ('0'..'7')
    ;

fragment
UNICODE_ESC
    :   '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
    ;
当我试图从“Hello!”解析以下字符串时,它会返回一个类似这样的解析树

       <grammar test>
             |
             x
             |
----------------------------
 |           |             |
FROM    field_value        !
             |
         identifier
             |
          "Hello

|
x
|
----------------------------
|           |             |
从字段值开始!
|
标识符
|
“你好
它将我认为应该是一个字符串的内容解析为一个标识符,虽然我的标识符没有说明任何关于双qooets的内容,所以它不应该匹配

此外,我认为我对字符串的定义是错误的,尽管AntlWorks为我生成了它。有人知道为什么会发生这种情况吗


干杯!

你的语法没有问题。对你来说搞砸的事情很可能是你正在使用AntlWorks的解释器。不要。解释器工作不好

改为使用ANTLRWorks的调试器(在语法中,按CTRL+D),这就像一个符咒。这是调试器在解析“Hello!“:


你的语法没有问题。对你来说,最糟糕的是你使用的是AntlWorks的解释器。不要。解释器工作不好

改为使用ANTLRWorks的调试器(在语法中,按CTRL+D),这就像一个符咒。这是调试器在解析“Hello!“:


有一个问题……在我目前的位置,我没有访问java编译器的权限……当我到达一台有编译器的计算机时,我会检查您的解决方案。干杯!@bkwint,也许您的较大语法有问题,但您发布的语法绝对没有问题。较大的语法在我看来工作正常读取字段_值…它的格式完全相同。因此,我希望这是唯一会出现的问题!当您看到声誉出现时,您将知道您的解决方案是否正确!有一个问题…在我当前的位置,我没有访问java编译器的权限…当我到达计算机时,我将检查您的解决方案r与编译器。干杯!@bkwint,也许你的较大语法有问题,但你发布的语法绝对没有问题。较大的语法工作正常,直到我读取字段_值为止…它以完全相同的格式出错。所以我希望这是唯一会发生的问题!当你看到rep时你会知道你的解决方案是否正确!