检查词法分析器中的上一个/左侧标记

时间:2013-01-09 20:04:34

标签: antlr4

如何在词法分析器中找到上一个/左侧标记
例如

lexer grammar TLexer;

ID     : [a-zA-Z] [a-zA-Z0-9]*;
CARET  : '^';
RTN    : {someCond1}? CARET ID; // CARET not include this token
GLB    : {someCond2}? CARET ID; // CARET not include this token

2 个答案:

答案 0 :(得分:4)

谢谢,我是这样做的

lexer grammar TLexer;

@lexer::members {
    int lastTokenType = 0;
public void emit(Token token) {
    super.emit(token);
    lastTokenType = token.getType();
}
}

CARET  : '^';
RTN    : {someCond1&&(lastTokenType==CARET)}? ID;
GLB    : {someCond2&&(lastTokenType==CARET)}? ID;
ID     : [a-zA-Z] [a-zA-Z0-9]*;

答案 1 :(得分:0)

我看了一下Lexer的来源。 Lexer回答nextToken()调用(来自解析器)。我没有发现它跟踪以前的令牌。并且没有直接访问CARET。鉴于此输入:

xyz ^abc

和这个语法:

lexer grammar TLexer;

ID     : [a-zA-Z] [a-zA-Z0-9]* {System.out.println("ID ");} ;
CARET  : '^'                   {System.out.println("CARET ");} ;
WS     : [ \r\n] ;
RTN    : CARET ID {System.out.println("RTN " + _tokenStartCharIndex);} ;

输出是:

$ antlr4 TLexer.g4 
$ javac TLexer.java 
$ grun TLexer tokens -tokens -diagnostics -trace input.txt 
ID 
RTN 4
[@0,0:2='xyz',<1>,1:0]
[@1,3:3=' ',<3>,1:3]
[@2,4:7='^abc',<4>,1:4]
[@3,8:8='\n',<3>,1:8]
[@4,9:8='<EOF>',<-1>,2:9]

词法分析器为您提供类型为&lt; 4&gt;的单个标记。 (RTN)输入^abc