代码之家  ›  专栏  ›  技术社区  ›  luiscubal

ANTLR隐藏通道空白问题

  •  2
  • luiscubal  · 技术社区  · 17 年前

    我有以下ANTLR语法:

    grammar MyGrammar;
    
    doc :   intro planet;
    intro   :   'hi';
    planet  :   'world';
    MLCOMMENT 
        :   '/*' ( options {greedy=false;} : . )* '*/' { $channel = HIDDEN; };
    WHITESPACE : ( 
        (' ' | '\t' | '\f')+
      |
        // handle newlines
        ( '\r\n'  // DOS/Windows
          | '\r'    // Macintosh
          | '\n'    // Unix
        )
        )
     { $channel = HIDDEN; };
    

    在AntlWorks 1.2.3解释器中,输入 hi world , hi/**/world hi /*A*/ world 按预期工作。

    但是,输入 hiworld 哪一个 不应该 工作,也被接受。 我该怎么做 海沃思 失败了?如何在“hi”和“world”之间强制至少有一个空格(或注释)?

    注意,在这个示例中,我只使用了mlcomment和whitespace来简化,但是其他类型的注释将得到支持。

    2 回复  |  直到 17 年前
        1
  •  6
  •   Sam Harwell    17 年前

    您需要创建一个通用ID令牌。由于lexer构建了它所能构建的最长的令牌,它将把输入“hi world”看作一个单独的单词,因为它自身比“hi”或“world”长。这样的规则可能看起来像:

    ID : ('a'..'z' | 'A'..'Z')+;
    

    例如,编程语言的解析器就是这样将“do”关键字从“double”(关键字类型,以“do”)或“done”(变量名)中分离出来的。

        2
  •  0
  •   Luke Woodward    17 年前

    制作绳子的一种方法 hiworld fail是使用保证失败的验证语义谓词,如下所示:

    doc:      intro planet;
    failure : 'hiworld' { false }?;
    intro   : 'hi';
    planet  : 'world';
    // rest of grammar omitted