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。
有没有办法 "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。