如何编写一个规则,在写字符串时强制行延续字符



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

的例子:

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)
  • 除了新行和双引号。

相关内容

  • 没有找到相关文章

最新更新