Triple引用的字符串的Antlr语法



我正在尝试更新以下规格

的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语法)

我尝试了Antrl 4中的以下内容,但它在三重引用的字符串

中不会识别超过1个字符
string : triplequotedstring | StringValue ;
triplequotedstring: '"""' triplequotedstringpart?  '"""';
triplequotedstringpart : EscapedTripleQuote* | SourceCharacter*;
EscapedTripleQuote : '\"""';
SourceCharacter :[u0009u000Au000Du0020-uFFFF];
StringValue: '"' (~(["\nru2028u2029])|EscapedChar)* '"';

有了这些规则,它将识别'" a"'',但是一旦添加更多字符,它就会失败

eg:'"" abc"''''''''''

line 1:14 extraneous input 'abc' expecting {'"""', '\"""', SourceCharacter}

我如何使用''"'''''''''''''

您的某些解析器规则确实应该是Lexer规则。SourceCharacter可能是fragment

另外,您可能需要( EscapedTripleQuote | SourceCharacter )*而不是EscapedTripleQuote* | SourceCharacter*。第一个匹配aaa...bbb...,而您可能是要匹配aababbba...

尝试这样的东西:

string
 : Triplequotedstring 
 | StringValue 
 ;
Triplequotedstring
 : '"""' TriplequotedstringPart*? '"""'
 ;
StringValue
 : '"' ( ~["\nru2028u2029] | 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 :[u0009u000Au000Du0020-uFFFF];

相关内容

  • 没有找到相关文章

最新更新