Antlr隐藏的通道空白问题

时间:2009-07-18 16:44:18

标签: whitespace antlr hidden ignore channel

我有以下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; };

在ANTLRWorks 1.2.3解释器中,输入hi worldhi/**/worldhi /*A*/ world正常工作。

但是,也接受不应该工作的输入hiworld。 如何使hiworld失败?如何在“hi”和“world”之间强制至少有一个空格(或注释)?

请注意,我在此示例中仅使用了MLCOMMENT和WHITESPACE来简化,但支持其他类型的注释。

2 个答案:

答案 0 :(得分:6)

您需要创建一般ID标记。由于词法分析器可以构建最长的令牌,因此它将输入“hiworld”视为一个单词,因为它比“hi”或“world”本身更长。这样的规则可能如下:

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

作为一个例子,这就是编程语言的解析器如何将“do”关键字与“double”(关键字类型,以“do”开头)或“done”(变量名称)分开。

答案 1 :(得分:0)

使字符串hiworld失败的一种方法是使用保证失败的验证语义谓词,如下所示:

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