我想写一个解析双引号内字符串的规则。我想允许任何字符,唯一的条件是必须有一个行延续字符,当将字符串分割成多行时。
的例子:
variable = "first line n second line
still second line n
third line"
如果在找到换行符之前没有找到换行符,我希望解析器停止。
我现在的规则是:
STRING : '"' (ESC|.)*? '"';
fragment ESC : '\' [btnr"\] ;
所以我允许字符串包含任何字符,包括一堆转义序列。但是我并不是真的强制要求行连续字符是分割文本的必要条件。
如何使语法执行该规则?
尽管已经有一个公认的答案,但我还是要发表我的看法。我强烈建议不要在词法分析器规则中处理这种类型的错误。原因是您将无法为用户提供良好的错误消息。首先,词法分析器错误通常不会在ANTLR4中单独报告,它们显示为后续解析器错误。其次,生成的错误(可能是:&;no viable alt at n&;)几乎是有用的。
更好的解决方案是接受两种变体(带转义或不带转义的换行),然后进行语义检查。这样,您就可以确切地知道哪里出了问题,并且用户可以告诉您真正期望的是什么。
解决方案
fragment ESCAPE
: '\' .
;
STRING
: '"' (ESCAPE | ~[n"])* '"'
;
<标题>片段ESCAPE
将匹配转义字符(特别是反斜杠和作为延续符号的新行字符)。
令牌STRING
将在双引号内匹配:
- 转义字符(片段
ESCAPE
) - 除了新行和双引号。