Antlr Lexer排除某种模式

时间:2013-10-07 11:51:58

标签: antlr antlr4

在Antlr Lexer中,我如何实现解析这样的令牌:

包含任何非空格字母但不包含“。{”的单词。我能想出的最好的是使用语义谓词。

WORD: WL+   {!getText().contains(".{")};
WL: ~[ \n\r\t];

我有点担心使用语义谓词虽然因为WORD在这里会被数倍数倍的麻烦,我认为把语义谓词命中将会达到性能。

这要求我需要解析类似的内容:

TOKEN_ONE.{TOKEN_TWO}

虽然TOKEN_ONE可以包括。和{在其信中。

我正在使用Antlr 4.

2 个答案:

答案 0 :(得分:0)

您需要在输入中的.之后立即将谓词评估限制为大小写。

WORD
  : ( ~[. \t\r\n]
    | '.' {_input.LA(1)!='{'}?
    )+
  ;

答案 1 :(得分:-2)

如何将你的问题改为等同的“一个单词包含除空格或点或左括号括号之外的任何字符。”

然后勒克斯规则就是:

 WORD:  ~[ \n\r\t.{]*