Antlr隐藏的通道空白问题

lui*_*bal 2 whitespace hidden antlr 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; };
Run Code Online (Sandbox Code Playgroud)

在ANTLRWorks 1.2.3解释器,输入hi world,hi/**/worldhi /*A*/ world工作,符合市场预期.

但是,hiworld应该接受不应该起作用的输入.我怎么做hiworld失败?如何在"hi"和"world"之间强制至少有一个空格(或注释)?

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

Sam*_*ell 6

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

ID : ('a'..'z' | 'A'..'Z')+;
Run Code Online (Sandbox Code Playgroud)

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