たとえば 、レクサーで前/左のトークンを見つけるにはどうすればよいですか
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
等
たとえば 、レクサーで前/左のトークンを見つけるにはどうすればよいですか
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
等
ありがとう、私はこのようにしました
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]*;
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]
lexer は、入力に対してタイプ <4> (RTN) の単一のトークンを提供します^abc
。