【问题标题】:antlr grammar for triple quoted string三引号字符串的antlr语法
【发布时间】:2018-02-18 09:27:23
【问题描述】:

我正在尝试更新遵循以下规范的 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"""' 但只要我添加更多字符,它就会失败

eg: '"""abc"""' 不会解析,ANTLR 的 IntelliJ 插件说

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

如何在 ANTLR 中使用 '\"""' 转义三引号字符串?

【问题讨论】:

    标签: java antlr antlr4 graphql graphql-java


    【解决方案1】:

    您的某些 parer 规则实际上应该是词法分析器规则。 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];
    

    【讨论】:

    • 谢谢。我照原样接受了上面的内容,它似乎让 IDEA ANTLR 插件很开心,所以我会在代码中尝试一下,看看我会怎么做。
    • 嗯,说得太早了——它太贪婪了,所以输入像 { field(triple : """"triple string""", triple2 : """another string""" ) }合并为一个长的三重字符串。
    • 啊,需要不贪心吗?片段上的指示器
    • 片段 TripleQuotedStringPart : (EscapedTripleQuote | SourceCharacter))+?;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多