static int statement (LexState *ls) { int line = ls->linenumber; /* may be needed for error messages */ switch (ls->t.token) { case TK_IF: { /* stat -> ifstat */ ifstat(ls, line); return 0; } case TK_WHILE: { /* stat -> whilestat */ whilestat(ls, line); return 0; } case TK_DO: { /* stat -> DO block END */ luaX_next(ls); /* skip DO */ block(ls); check_match(ls, TK_END, TK_DO, line); return 0; } case TK_FOR: { /* stat -> forstat */ forstat(ls, line); return 0; } case TK_REPEAT: { /* stat -> repeatstat */ repeatstat(ls, line); return 0; } case TK_FUNCTION: { funcstat(ls, line); /* stat -> funcstat */ return 0; } case TK_LOCAL: { /* stat -> localstat */ luaX_next(ls); /* skip LOCAL */ if (testnext(ls, TK_FUNCTION)) /* local function? */ localfunc(ls); else localstat(ls); return 0; } case TK_RETURN: { /* stat -> retstat */ retstat(ls); return 1; /* must be last statement */ } case TK_BREAK: { /* stat -> breakstat */ luaX_next(ls); /* skip BREAK */ breakstat(ls); return 1; /* must be last statement */ } #if LUA_EXT_CONTINUE case TK_CONTINUE: { /* stat -> continuestat */ luaX_next(ls); /* skip CONTINUE */ continuestat(ls); return 1; /* must be last statement */ } #endif /* LUA_EXT_CONTINUE */ default: { exprstat(ls); return 0; /* to avoid warnings */ } } }
static int statement (LexState *ls) { int line = ls->linenumber; /* may be needed for error messages */ switch (ls->t.token) { case TK_IF: { /* stat -> ifstat */ ifstat(ls, line); return 0; } case TK_WHILE: { /* stat -> whilestat */ whilestat(ls, line); return 0; } case TK_DO: { /* stat -> DO block END */ luaX_next(ls); /* skip DO */ block(ls); check_match(ls, TK_END, TK_DO, line); return 0; } case TK_FOR: { /* stat -> forstat */ forstat(ls, line); return 0; } case TK_REPEAT: { /* stat -> repeatstat */ repeatstat(ls, line); return 0; } case TK_FUNCTION: { funcstat(ls, line); /* stat -> funcstat */ return 0; } case TK_LOCAL: { /* stat -> localstat */ luaX_next(ls); /* skip LOCAL */ if (testnext(ls, TK_FUNCTION)) /* local function? */ localfunc(ls); else localstat(ls); return 0; } case TK_RETURN: { /* stat -> retstat */ retstat(ls); return 1; /* must be last statement */ } case TK_BREAK: { /* stat -> breakstat */ luaX_next(ls); /* skip BREAK */ if (testnext(ls, TK_NUMBER)) { /* multi scope 'break n' */ breakstat(ls, ls->t.seminfo.r); } else breakstat(ls, 1); return 1; /* must be last statement */ } case TK_CONTINUE: { /* stat -> continuestat */ luaX_next(ls); /* skip CONTINUE */ continuestat(ls); return 1; /* must be last statement */ } case TK_INC: { /* added 0.5.2.*/ luaX_next(ls); changevalue(ls, OP_ADD); return 0; } case TK_DEC: { /* added 0.5.2.*/ luaX_next(ls); changevalue(ls, OP_SUB); return 0; } case TK_CASE: { /* added 0.5.2.*/ selectstat(ls, line); return 0; } default: { exprstat(ls); return 0; /* to avoid warnings */ } } }