antlr4 中的回溯词法分析器成员

Lookback lexer member in antlr4

有没有办法 "fake" 在 Antlr4 中进行回顾? 我想根据我所在位置之前的令牌解决一些歧义。

编辑

read: STAR text STAR text STAR text
| STAR text STAR KEY_WORD STAR text

text: STR +;

@lexer::members {
  private boolean checkAhead(int maxAmountOfCharacters, String pattern) {
    final Interval ahead = new Interval(this._tokenStartCharIndex, this._tokenStartCharIndex + maxAmountOfCharacters - 1);
    return this._input.getText(ahead).matches(pattern);
  }

KEY_WORD: LETTER LETTER LETTER LETTER LETTER ;
STAR :'*';

STR: {( !checkAhead(6, "([A-Z]){5}[*](\D|$)") }?
    (
        LETTER
        | DIGIT
    )+
;

我希望仅当输入为 STAR KEY_WORD STAR 时才将输入读取为 KEY_WORD 现在,如果文本的最后一个词是 [A-Z]{5},它会匹配到 KEY_WORD

您可以在前瞻函数 LA() 和 LT() 中使用负偏移量(LA 只为您提供标记类型,而 LT 为您提供整个标记)。 注:LA(0)未定义,但可以使用LA(-1)、LA(-2)、LT(5)等

另一个注意事项: 进一步回顾只适用于缓冲令牌流。无缓冲流仅缓存单个令牌(前一个)。

TokenStream class(您的 this._input 实例从中派生)定义了 LT() 函数。 LA() 在 IntStream class 中可用(它是任何字符输入流的祖先,例如 CharStream 或 ANTLRInputStream。