ANTLR:如何在编写字符串时编写强制执行续行字符的规则?

时间:2016-10-19 16:16:07

标签: string antlr4

我想编写一条规则来解析双引号内的字符串。我想允许任何字符,唯一的条件是,当在多行上分割字符串时,必须有一个行连续字符\。

示例:

variable = "first line \n second line \
            still second line \n \
            third line"

如果在找到换行符之前找不到行继续符,我希望解析器能够进行barf。

我目前的规则是:

STRING  : '"' (ESC|.)*? '"';
fragment ESC : '\\' [btnr"\\] ;

所以我允许字符串包含任何字符,包括一堆转义序列。但我并没有真正强制执行该行继续字符\是分割文本的必要条件。

如何让语法强制执行该规则?

2 个答案:

答案 0 :(得分:1)

解决方案

fragment ESCAPE
    : '\\' .
    ;
STRING
    : '"' (ESCAPE | ~[\n"])* '"'
    ;

解释

片段ESCAPE将匹配转义字符(尤其是反斜杠和用作连续符号的新行字符)。

令牌STRING将在双引号内匹配:

  • 转义字符(片段ESCAPE
  • 除了新行和双引号之外的所有内容。

答案 1 :(得分:1)

即使已经有一个已接受的答案,让我加入我的2cents。我强烈建议不要在词法规则中处理这种类型的错误。原因是您将无法向用户提供良好的错误消息。首先,在ANTLR4中通常不会单独报告词法分析器错误,它们表现为后续解析器错误。其次,产生的错误(可能类似于:“在n中没有可行的alt”)几乎是有帮助的。

更好的解决方案是接受两种变体(使用换行符或不使用换行符)并在之后进行语义检查。然后你就知道到底出了什么问题,用户能说出你真正的期望。