Parsing Lexer antlr3令牌问题

Parsing Lexer antlr3令牌问题,parsing,antlr,grammar,token,lexer,Parsing,Antlr,Grammar,Token,Lexer,我可以构造一个令牌吗 ENDPLUS: '+' (options (greedy = false;):.) * '+' ; 只有在词条前面有一个标记PRE,而没有包含在ENDPLUS中时,才被词条分析器考虑 PRE: '<<' ; PRE:”不,抱歉,这不可能“开箱即用”。通过使用属性input并在其上调用LA(int)(look ahead),可以对lexer或解析器中的令牌流进行前瞻控制。例如,以下lexer规则: Token : {inpu

我可以构造一个令牌吗

ENDPLUS: '+' (options (greedy = false;):.) * '+'
       ;
只有在词条前面有一个标记
PRE
,而没有包含在ENDPLUS中时,才被词条分析器考虑

PRE: '<<'
       ;

PRE:”不,抱歉,这不可能“开箱即用”。通过使用属性
input
并在其上调用
LA(int)
(look ahead),可以对lexer或解析器中的令牌流进行前瞻控制。例如,以下lexer规则:

Token
  :  {input.LA(2) == 'b'}? . 
  ;
匹配任何单个字符,只要该单个字符后跟a
b
。不幸的是,令牌流中没有
input.LA(-1)
特性可供查找。
{…}?
部分称为“语法谓词”,以防您想知道或想用谷歌搜索它

下面给出了一个讨论,以及关于如何着手解决该问题的一些建议:


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

不,抱歉,这是不可能“开箱即用”的。通过使用属性
input
并在其上调用
LA(int)
(look ahead),可以对lexer或解析器中的令牌流进行前瞻控制。例如,以下lexer规则:

Token
  :  {input.LA(2) == 'b'}? . 
  ;
匹配任何单个字符,只要该单个字符后跟a
b
。不幸的是,令牌流中没有
input.LA(-1)
特性可供查找。
{…}?
部分称为“语法谓词”,以防您想知道或想用谷歌搜索它

下面给出了一个讨论,以及关于如何着手解决该问题的一些建议:


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

查看IntStream.java的代码,允许将负整数作为LA的参数,并将获得先前匹配的令牌。因此,检查之前匹配的令牌就成了一个问题,希望nioo能够限制检查的时间。也许其他语言不同,但Java允许您检查以前的令牌。@WayneH,我会检查的,谢谢。希望nioo也能阅读您的评论。查看IntStream.java的代码,负整数被允许作为LA的参数,并将获得先前匹配的令牌。因此,检查之前匹配的令牌就成了一个问题,希望nioo能够限制检查的时间。也许其他语言不同,但Java允许您检查以前的令牌。@WayneH,我会检查的,谢谢。希望nioo也能读到你的评论。