Antlr String无法匹配

时间:2012-08-10 08:39:29

标签: string antlr antlr3

我正在研究一个小问题。在我的小型自定义DSL中,我希望能够在字段之间进行比较操作。我有三个fieldtypes(String,Int,Identifier),Identifier是一个变量名。我做了一个很大的规范,但我把问题缩小到了更小的语法。

问题在于,当我尝试使用String语法表示法时,可以使用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
    ;

当我尝试解析以下字符串FROM "Hello!"时,它会返回一个像这样的

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

它将我认为应该是字符串的内容解析为标识符,因为我的标识符没有说明双重要求,所以它不应该匹配。

此外我认为我对字符串的定义是错误的,即使antlrworks为我生成它。有人知道为什么会这样吗?

干杯!

1 个答案:

答案 0 :(得分:1)

你的语法没有错。让你搞砸的事情很可能就是你正在使用ANTLRWorks的解释器。别。口译员效果不佳。

使用ANTLRWorks的调试器(在你的语法中,按 CTRL + D ),它就像一个魅力。这是解析器在解析FROM "Hello!"之后显示的内容:

enter image description here