java - 三引号字符串的反语法

标签 java antlr antlr4 graphql graphql-java

我正在尝试更新遵循以下规范的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 :[\u0009\u000A\u000D\u0020-\uFFFF];

StringValue: '"' (~(["\\\n\r\u2028\u2029])|EscapedChar)* '"';


使用这些规则,它将识别出“””“ a”””,但是一旦我添加更多字符,它就会失败

例如:'“”“ abc”“”'不会解析,ANTLR的IntelliJ插件说

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


如何在ANTLR中用'\“”“'转义三引号的字符串?

最佳答案

您的某些比较器规则实际上应该是词法分析器规则。并且SourceCharacter应该应该是fragment

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

尝试这样的事情:

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];

关于java - 三引号字符串的反语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46133654/

相关文章:

表达式的 ANTLR 文法

java - 在 ANTLR 解析器中跳过空格

parsing - 在 ANTLR4 中使用什么来解决更复杂情况下的歧义(而不是句法谓词)?

java - 为什么可以创建抽象类的变量?

java - 编译消息 : unchecked method invocation; <t>sort(java. util.list<T>)

java - 从 XML 文件中获取命名空间

javascript - 确定 ECMAScript 赋值表达式的左侧或右侧

java - 您能否用 C# 代码解释这段代码?

java - Antlr 左分解语法

java - antlr4数组实现: getting values of elements