Java 三引号字符串的antlr语法
我正在尝试更新遵循以下规范的ANTLR语法 从逻辑上讲,它的定义是Java 三引号字符串的antlr语法,java,antlr,antlr4,graphql,graphql-java,Java,Antlr,Antlr4,Graphql,Graphql Java,我正在尝试更新遵循以下规范的ANTLR语法 从逻辑上讲,它的定义是 StringValue :: - `"` StringCharacter* `"` - `"""` MultiLineStringCharacter* `"""` StringCharacter :: - SourceCharacter but not `"` or \ or LineTerminator - \u EscapedUnicode - \ EscapedCharacter MultiL
StringValue ::
- `"` StringCharacter* `"`
- `"""` MultiLineStringCharacter* `"""`
StringCharacter ::
- SourceCharacter but not `"` or \ or LineTerminator
- \u EscapedUnicode
- \ EscapedCharacter
MultiLineStringCharacter ::
- SourceCharacter but not `"""` or `\"""`
- `\"""`
(以上不是逻辑-不是ANTLR语法)
我在Antral 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中使用“\”“”转义来处理三引号字符串?您的一些parer规则实际上应该是lexer规则。而
SourceCharacter
可能应该是片段
另外,您可能需要(EscapedTripleQuote | SourceCharacter*)
,而不是(EscapedTripleQuote | SourceCharacter)*
。第一个匹配aaa…
或bbb…
,而您可能想要匹配aababba…
请尝试以下方法:
string
: Triplequotedstring
| StringValue
;
Triplequotedstring
: '"""' TriplequotedstringPart*? '"""'
;
StringValue
: '"' ( ~["\\\n\r\u2028\u2029] | EscapedChar )* '"'
;
// Fragments never become a token of their own: they are only used inside other lexer rules
fragment TriplequotedstringPart : EscapedTripleQuote | SourceCharacter;
fragment EscapedTripleQuote : '\\"""';
fragment SourceCharacter :[\u0009\u000A\u000D\u0020-\uFFFF];
谢谢。我把上面的内容原封不动,这似乎让ANTLR插件的想法很开心,所以我会在代码中尝试一下,看看我是怎么做的。嗯,说得太快了-太贪婪了,所以输入像{field(triple:“triple string”“,triple2:“other string”“)}正在合并为一个长的三重字符串。啊,需要非贪婪的吗?fragmentfragment TripleQuotedStringPart上的指示器:(EscapedTripleQuote | SourceCharacter))+?;