我正在尝试更新以下规格
的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];