我想编写一条规则来解析双引号内的字符串。我想允许任何字符,唯一的条件是,当在多行上分割字符串时,必须有一个行连续字符\。
示例:
variable = "first line \n second line \
still second line \n \
third line"
如果在找到换行符之前找不到行继续符,我希望解析器能够进行barf。
我目前的规则是:
STRING : '"' (ESC|.)*? '"';
fragment ESC : '\\' [btnr"\\] ;
所以我允许字符串包含任何字符,包括一堆转义序列。但我并没有真正强制执行该行继续字符\是分割文本的必要条件。
如何让语法强制执行该规则?
答案 0 :(得分:1)
fragment ESCAPE
: '\\' .
;
STRING
: '"' (ESCAPE | ~[\n"])* '"'
;
片段ESCAPE
将匹配转义字符(尤其是反斜杠和用作连续符号的新行字符)。
令牌STRING
将在双引号内匹配:
ESCAPE
)答案 1 :(得分:1)
即使已经有一个已接受的答案,让我加入我的2cents。我强烈建议不要在词法规则中处理这种类型的错误。原因是您将无法向用户提供良好的错误消息。首先,在ANTLR4中通常不会单独报告词法分析器错误,它们表现为后续解析器错误。其次,产生的错误(可能类似于:“在n中没有可行的alt”)几乎是有帮助的。
更好的解决方案是接受两种变体(使用换行符或不使用换行符)并在之后进行语义检查。然后你就知道到底出了什么问题,用户能说出你真正的期望。