2

我有以下 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但是,不应该工作的 input也被接受。我如何使hiworld失败?如何在“hi”和“world”之间强制使用至少一个空格(或注释)?

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

4

2 回答 2

6

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

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

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

于 2009-07-19T01:54:26.187 回答
0

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

doc:      intro planet;
failure : 'hiworld' { false }?;
intro   : 'hi';
planet  : 'world';
// rest of grammar omitted
于 2009-07-18T18:03:04.533 回答