2013-06-26 46 views
0

消費總是出現在這樣的地方:(在*的.jj文件生成的* Parser.java文件)在javacc中'消費'是什麼意思?

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

從概念上講,輸入流是一系列常規(即非特殊)標記。其中一個令牌是「當前令牌」。當前令牌之前的令牌可能是垃圾--i.e生成的代碼不會保留指向它們的指針 - 當前令牌可能尚未構建之後的令牌。當前令牌是解析器用來做出大部分決策的標記。例如。像

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參數用來指示預期類型的​​令牌。

+0

你知道..'kind'是從外面傳遞的參數... –