消费总是出现在这样的地方:(在生成的* .jj文件的* Parser.java文件中)
jj_consume_token(0);
jj_consume_token(-1);
上面代码中0和-1的含义是什么?
private Token jj_consume_token(int kind) throws ParseException {
Token oldToken;
if ((oldToken = token).next != null) token = token.next;
else token = token.next = token_source.getNextToken();
jj_ntk = -1;
if (token.kind == kind) {
jj_gen++;
if (++jj_gc > 100) {
jj_gc = 0;
for (int i = 0; i < jj_2_rtns.length; i++) {
JJCalls c = jj_2_rtns[i];
while (c != null) {
if (c.gen < jj_gen) c.first = null;
c = c.next;
}
}
}
trace_token(token, "");
return token;
}
token = oldToken;
jj_kind = kind;
throw generateParseException();
}
函数的返回令牌是什么意思?
总之,'消费'在javacc中意味着什么?
答案 0 :(得分:0)
从概念上讲,输入流是一系列常规(即非特殊)令牌。其中一个令牌是“当前令牌”。当前令牌之前的令牌可能是垃圾 - 即生成的代码没有指向它们的指针 - 当前令牌之后的令牌可能尚未构建。当前令牌是解析器用于做出大部分决策的令牌。例如。像
这样的制作void A() : {} { <X> <Y> <Z> | <Y> <Z> | <Z> }
将转换为基于当前令牌类型进行切换的例程。
void A() {
switch( <<the kind of the current token>> ) {
case X: jj_consume_token(X) ; jj_consume_token(Y) ; jj_consume_token(Z) ; return ;
case Y: jj_consume_token(Y) ; jj_consume_token(Z) ; return ;
case Z: jj_consume_token(Z) ; return ; }
指向当前令牌的指针保存在字段token
中。 jj_consume_token
方法将此标记替换为输入中的下一个标记。基本上jj_consume_token
做的是这个
if( token.next == null ) token.next = <<construct the next token>> ;
token = token.next ;
if( token.kind != kind) <<throw an exception>> ;
else return token ;
kind
参数用于指示预期的令牌类型。