【问题标题】:Antlr String can not matchAntlr 字符串无法匹配
【发布时间】:2012-08-10 08:39:28
【问题描述】:

我正在处理一个小蚂蚁问题。在我的小型自定义 DSL 中,我希望能够在字段之间进行比较操作。我有三个字段类型(字符串、整数、标识符)标识符是一个变量名。我制定了一个很大的规范,但我已经将我的问题简化为更小的语法。

问题是,当我尝试使用字符串语法符号时,您可以使用 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 为我生成了它。有人知道为什么会这样吗?

干杯!

【问题讨论】:

    标签: string antlr antlr3


    【解决方案1】:

    你的语法没有问题。让你搞砸的事情很可能是因为你使用的是 ANTLRWorks 的解释器。不。解释器不好用。

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

    【讨论】:

    • 嗯,有一个问题...在我当前的位置,我无法访问 java 编译器...当我到达带有编译器的计算机时,我会检查您的解决方案。干杯!
    • @bkwint,也许你的大语法有问题,但你发的语法绝对没有问题。
    • 较大的语法在我阅读 field_value 之前工作正常......格式完全相同。所以我希望这是唯一会发生的问题!当您看到声誉出现时,您就会知道您的解决方案是否正确!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多