【问题标题】:Lexer antlr3 token problemLexer antlr3 令牌问题
【发布时间】:2010-03-29 16:22:36
【问题描述】:

我可以构造一个令牌

ENDPLUS: '+' (options (greedy = false;):.) * '+'
       ;

仅当它前面有一个标记 PRE 而不包括在 ENDPLUS 中时才被词法分析器考虑?

PRE: '<<'
       ;

谢谢。

【问题讨论】:

    标签: parsing antlr grammar token lexer


    【解决方案1】:

    不,AFAIK,这不可能“开箱即用”。通过使用属性input 并在其上调用LA(int) (look-ahead),只有 look-ahead-control 在词法分析器或解析器中的标记流上。例如,以下词法分析器规则:

    Token
      :  {input.LA(2) == 'b'}? . 
      ;
    

    匹配任何单个字符,只要该单个字符后跟b。不幸的是,在令牌流中没有 input.LA(-1) 功能可以查看。 {...}? 部分称为“句法谓词”,以防您想知道或想用 Google 搜索它。

    此处提供了讨论以及有关如何解决该问题的一些指示:http://www.antlr.org/pipermail/antlr-interest/2004-July/008673.html

    请注意,它是{greedy=false;},而不是(greedy=false;)

    【讨论】:

    • 查看 IntStream.java 的代码,允许负整数作为 LA 的参数,并将获得先前匹配的令牌。所以它只是检查先前匹配的令牌的问题,希望 nioo 可以限制检查多远。也许其他语言不同,但 Java 将允许您检查先前的标记。
    • @WayneH,我去看看,谢谢。希望 nioo 也会阅读您的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多