1

消費は常に次のような場所に表示されます:(*.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();
}

関数の return-Token はどういう意味ですか?

javaccで「消費」とはどういう意味ですか?

4

1 に答える 1

1

概念的には、入力ストリームは通常の (つまり特別ではない) トークンのシーケンスです。これらのトークンの 1 つが「現在のトークン」です。現在のトークンより前のトークンはガベージである可能性があります。つまり、生成されたコードはそれらへのポインタを保持しません。現在のトークンより後のトークンはまだ構築されていない可能性があります。現在のトークンは、パーサーがほとんどの決定を行うために使用するトークンです。たとえば、次のようなプロダクション

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 ; }

現在のトークンへのポインターは field に保持されます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パラメータは、予期されるトークンの種類を示すために使用されます。

于 2013-06-26T13:30:15.740 に答える