我正在尝试更新一个遵循以下规范的ANTLR语法:
https://github.com/facebook/graphql/pull/327/files
从逻辑上讲,它被定义为:
StringValue ::
- `"` StringCharacter* `"`
- `"""` MultiLineStringCharacter* `"""`
StringCharacter ::
- SourceCharacter but not `"` or \ or LineTerminator
- \u EscapedUnicode
- \ EscapedCharacter
MultiLineStringCharacter ::
- SourceCharacter but not `"""` or `\"""`
- `\"""`
请注意,上述内容是逻辑语句而不是ANTLR语法。
我在ANTLR 4中尝试了以下内容,但它无法识别三引号字符串中超过1个字符的内容。
string : triplequotedstring | StringValue ;
triplequotedstring: '"""' triplequotedstringpart? '"""';
triplequotedstringpart : EscapedTripleQuote* | SourceCharacter*;
EscapedTripleQuote : '\\"""';
SourceCharacter :[\u0009\u000A\u000D\u0020-\uFFFF];
StringValue: '"' (~(["\\\n\r\u2028\u2029])|EscapedChar)* '"';
通过这些规则,它能够识别 '"""a"""',但当我添加更多字符时就会失败
例如:'"""abc"""' 无法解析,ANTLR 的 IntelliJ 插件也会提示
line 1:14 extraneous input 'abc' expecting {'"""', '\\"""', SourceCharacter}
我该如何在ANTLR中使用三重引号字符串并使用'\"""'转义符号?