【问题标题】:AntLR - String Recognition ErrorAntLR - 字符串识别错误
【发布时间】:2014-07-20 16:04:33
【问题描述】:

我有一个 ANTLR 语法文件,其字符串定义如下

STRING
:  '"' (EscapeSequence | ~('\\'|'"') )* '"' ;
fragment EscapeSequence
  :   '\\' .
;

但是这个 Lexer 规则忽略了引号第一个实例中的转义字符。

id\=\"

被识别为字符串的开头,而前面有一个转义字符。这仅发生在第一个报价中。所有后续引号,如果转义,都可以正确识别。

/id\=\"Testing\" -- 不应该是字符串,因为两个引号都被转义了
/id\="Testing" -- 应该是引号之间的字符串,因为它们没有转义

要解决的主要问题是如果引号前面的字符(仅最后一个字符)是转义字符,则要避免词法分析器尝试识别字符串。如果有多个转义字符,我只需要考虑起始引号前的一个字符。

【问题讨论】:

  • 您能否更新问题以包含所需字符串语法的详细描述,以及正确和错误字符串的示例?
  • 用正负测试用例的简单示例更新问题

标签: string antlr stringescapeutils


【解决方案1】:

ANTLR 会在几乎所有情况下自动提供您想要的行为。考虑以下输入:

/id\=\"Testing\"

关键要求涉及第一个引号字符之前的标记的位置和长度。在下面的块中,我添加空格只是为了说明字符之间发生的情况。

/ i d \ = \ " T e s t i n g \ "
           ^
           |
           ----------- Make sure no token can *end* here

通过确保第一个 " 字符作为标记的一部分包含在它之前,您可以确保第一个 " 字符永远不会被解释为 @987654326 的开头@令牌。

如果不满足上述条件,您的" 字符被视为STRING 令牌的开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    相关资源
    最近更新 更多