Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 三引号字符串的antlr语法_Java_Antlr_Antlr4_Graphql_Graphql Java - Fatal编程技术网

Java 三引号字符串的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

我正在尝试更新遵循以下规范的ANTLR语法

从逻辑上讲,它的定义是

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))+?;