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 转义),然后进行语义检查。然后你就知道哪里出了问题,用户能说出你真正的期望吗。
我想编写一个规则来解析双引号内的字符串。我想允许任何字符,唯一的条件是在将字符串拆分为多行时必须有一个行继续字符 \。
示例:
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 转义),然后进行语义检查。然后你就知道哪里出了问题,用户能说出你真正的期望吗。