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

ANTLR: How to write a rule for enforcing line continuation character while writing a string?

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

示例:

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

如果在找到换行符之前没有找到续行符,我希望解析器停止。

我目前的规则是这样的:

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

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

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

解决方案

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

说明

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

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

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

尽管已经有一个可接受的答案,但让我投入 2 美分。我强烈建议不要在词法分析器规则中处理此类错误。原因是你将无法给用户一个好的错误信息。首先,词法分析器错误通常不会在 ANTLR4 中单独报告,它们会作为后续的解析器错误出现。其次,产生的错误(可能类似于:“\n 处没有可行的 alt”)几乎是有用的。

更好的解决方案是接受两种变体(带换行符或 w/o 转义),然后进行语义检查。然后你就知道哪里出了问题,用户能说出你真正的期望吗。