【问题标题】:Lookback lexer member in antlr4antlr4 中的回溯词法分析器成员
【发布时间】:2016-07-04 11:56:07
【问题描述】:

有没有办法在 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 匹配

【问题讨论】:

  • 请分享部分rour语法和你的问题的简单示例场景
  • 抱歉,问题和示例已更改
  • 需要提供标有预期结果的样本输入。从您的描述中不清楚您的要求。

标签: java grammar antlr4 lexer ambiguous


【解决方案1】:

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

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

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

【讨论】:

  • 是 antlr 4 中的 LT() 吗?我不能使用它,至少从我的词法分析器文件中你能添加一个小例子吗?谢谢
  • 添加了更多信息,在哪里可以找到 LA + LT。
  • 我试图访问 Lexer 文件中的 LT,这就是为什么我不能先使用它。谢谢!
  • @JCCNoobie,如果对您有帮助,请接受我的回答(投票箭头下的检查)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多