From 58fbdc76d558c8039a966852ca07802f0a413b11 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Thu, 25 May 2000 15:59:59 -0300 Subject: better implementation for looh-ahead --- llex.c | 4 ++-- llex.h | 8 ++++---- lparser.c | 23 +++++++++-------------- 3 files changed, 15 insertions(+), 20 deletions(-) diff --git a/llex.c b/llex.c index e5275682..3c446e23 100644 --- a/llex.c +++ b/llex.c @@ -1,5 +1,5 @@ /* -** $Id: llex.c,v 1.59 2000/05/24 13:54:49 roberto Exp roberto $ +** $Id: llex.c,v 1.60 2000/05/24 18:04:17 roberto Exp roberto $ ** Lexical Analyzer ** See Copyright Notice in lua.h */ @@ -108,7 +108,7 @@ static void firstline (LexState *LS) void luaX_setinput (lua_State *L, LexState *LS, ZIO *z) { LS->L = L; LS->current = '\n'; - LS->next.token = TK_EOS; /* no next token */ + LS->lookahead.token = TK_EOS; /* no look-ahead token */ LS->linenumber = 0; LS->iflevel = 0; LS->ifstate[0].skip = 0; diff --git a/llex.h b/llex.h index 7235bdc8..f6029d72 100644 --- a/llex.h +++ b/llex.h @@ -1,5 +1,5 @@ /* -** $Id: llex.h,v 1.25 2000/05/24 13:54:49 roberto Exp roberto $ +** $Id: llex.h,v 1.26 2000/05/24 18:04:17 roberto Exp roberto $ ** Lexical Analyzer ** See Copyright Notice in lua.h */ @@ -53,9 +53,9 @@ typedef struct Token { } Token; typedef struct LexState { - int current; /* look ahead character */ - Token t; /* look ahead token */ - Token next; /* to `unget' a token */ + int current; /* current character */ + Token t; /* current token */ + Token lookahead; /* look ahead token */ struct FuncState *fs; /* `FuncState' is private to the parser */ struct lua_State *L; struct zio *z; /* input stream */ diff --git a/lparser.c b/lparser.c index b39cafd0..5fd467b1 100644 --- a/lparser.c +++ b/lparser.c @@ -1,5 +1,5 @@ /* -** $Id: lparser.c,v 1.90 2000/05/24 18:04:17 roberto Exp roberto $ +** $Id: lparser.c,v 1.91 2000/05/25 18:26:42 roberto Exp roberto $ ** LL(1) Parser and code generator for Lua ** See Copyright Notice in lua.h */ @@ -56,18 +56,18 @@ static void exp1 (LexState *ls); static void next (LexState *ls) { - if (ls->next.token != TK_EOS) { /* is there an `unget' token? */ - ls->t = ls->next; /* use this one */ - ls->next.token = TK_EOS; /* and discharge it */ + if (ls->lookahead.token != TK_EOS) { /* is there a look-ahead token? */ + ls->t = ls->lookahead; /* use this one */ + ls->lookahead.token = TK_EOS; /* and discharge it */ } else ls->t.token = luaX_lex(ls); /* read next token */ } -static void ungettoken (LexState *ls, Token *t) { - ls->next = ls->t; - ls->t = *t; +static void lookahead (LexState *ls) { + LUA_ASSERT(ls->L, ls->lookahead.token == TK_EOS, "two look-aheads"); + ls->lookahead.token = luaX_lex(ls); } @@ -633,13 +633,8 @@ static void constructor_part (LexState *ls, Constdesc *cd) { break; } case TK_NAME: { /* may be listfields or recfields */ - Token current; - int nexttoken; /* to get the look ahead */ - current = ls->t; /* save for `unget' */ - next(ls); - nexttoken = ls->t.token; - ungettoken(ls, ¤t); - if (nexttoken != '=') /* expression? */ + lookahead(ls); + if (ls->lookahead.token != '=') /* expression? */ goto case_default; /* else go through to recfields */ } -- cgit v1.2.3-55-g6feb