176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** $Id: llex.c,v 2.63.1.2 2013/08/30 15:49:41 roberto Exp $
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** Lexical Analyzer
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** See Copyright Notice in lua.h
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef SYSLINUX
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <locale.h>
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#else
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define getlocaledecpoint() '.'
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <string.h>
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define llex_c
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define LUA_CORE
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lua.h"
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lctype.h"
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "ldo.h"
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "llex.h"
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lobject.h"
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lparser.h"
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lstate.h"
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lstring.h"
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "ltable.h"
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lzio.h"
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define next(ls) (ls->current = zgetc(ls->z))
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define currIsNewline(ls)	(ls->current == '\n' || ls->current == '\r')
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ORDER RESERVED */
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic const char *const luaX_tokens [] = {
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    "and", "break", "do", "else", "elseif",
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    "end", "false", "for", "function", "goto", "if",
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    "in", "local", "nil", "not", "or", "repeat",
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    "return", "then", "true", "until", "while",
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    "..", "...", "==", ">=", "<=", "~=", "::", "<eof>",
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    "<number>", "<name>", "<string>"
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman};
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define save_and_next(ls) (save(ls, ls->current), next(ls))
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic l_noret lexerror (LexState *ls, const char *msg, int token);
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void save (LexState *ls, int c) {
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  Mbuffer *b = ls->buff;
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  if (luaZ_bufflen(b) + 1 > luaZ_sizebuffer(b)) {
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    size_t newsize;
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (luaZ_sizebuffer(b) >= MAX_SIZET/2)
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      lexerror(ls, "lexical element too long", 0);
6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    newsize = luaZ_sizebuffer(b) * 2;
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    luaZ_resizebuffer(ls->L, b, newsize);
6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  }
6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  b->buffer[luaZ_bufflen(b)++] = cast(char, c);
6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid luaX_init (lua_State *L) {
7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  int i;
7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  for (i=0; i<NUM_RESERVED; i++) {
7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    TString *ts = luaS_new(L, luaX_tokens[i]);
7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    luaS_fix(ts);  /* reserved words are never collected */
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    ts->tsv.extra = cast_byte(i+1);  /* reserved word */
7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  }
7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanconst char *luaX_token2str (LexState *ls, int token) {
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  if (token < FIRST_RESERVED) {  /* single-byte symbols? */
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    lua_assert(token == cast(unsigned char, token));
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    return (lisprint(token)) ? luaO_pushfstring(ls->L, LUA_QL("%c"), token) :
8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                              luaO_pushfstring(ls->L, "char(%d)", token);
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  }
8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  else {
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    const char *s = luaX_tokens[token - FIRST_RESERVED];
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (token < TK_EOS)  /* fixed format (symbols and reserved words)? */
8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      return luaO_pushfstring(ls->L, LUA_QS, s);
8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    else  /* names, strings, and numerals */
9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      return s;
9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  }
9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic const char *txtToken (LexState *ls, int token) {
9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  switch (token) {
9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    case TK_NAME:
9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    case TK_STRING:
9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    case TK_NUMBER:
10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      save(ls, '\0');
10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      return luaO_pushfstring(ls->L, LUA_QS, luaZ_buffer(ls->buff));
10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    default:
10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      return luaX_token2str(ls, token);
10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  }
10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic l_noret lexerror (LexState *ls, const char *msg, int token) {
10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  char buff[LUA_IDSIZE];
11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  luaO_chunkid(buff, getstr(ls->source), LUA_IDSIZE);
11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  msg = luaO_pushfstring(ls->L, "%s:%d: %s", buff, ls->linenumber, msg);
11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  if (token)
11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    luaO_pushfstring(ls->L, "%s near %s", msg, txtToken(ls, token));
11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  luaD_throw(ls->L, LUA_ERRSYNTAX);
11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanl_noret luaX_syntaxerror (LexState *ls, const char *msg) {
11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  lexerror(ls, msg, ls->t.token);
12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*
12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** creates a new string and anchors it in function's table so that
12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** it will not be collected until the end of the function's compilation
12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** (by that time it should be anchored in function's prototype)
12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/
12876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanTString *luaX_newstring (LexState *ls, const char *str, size_t l) {
12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  lua_State *L = ls->L;
13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  TValue *o;  /* entry for `str' */
13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  TString *ts = luaS_newlstr(L, str, l);  /* create new string */
13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  setsvalue2s(L, L->top++, ts);  /* temporarily anchor it in stack */
13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  o = luaH_set(L, ls->fs->h, L->top - 1);
13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  if (ttisnil(o)) {  /* not in use yet? (see 'addK') */
13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    /* boolean value does not need GC barrier;
13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman       table has no metatable, so it does not need to invalidate cache */
13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    setbvalue(o, 1);  /* t[string] = true */
13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    luaC_checkGC(L);
13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  }
14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  else {  /* string already present */
14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    ts = rawtsvalue(keyfromval(o));  /* re-use value previously stored */
14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  }
14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  L->top--;  /* remove string from stack */
14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  return ts;
14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*
14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** increment line number and skips newline sequence (any of
15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** \n, \r, \n\r, or \r\n)
15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/
15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void inclinenumber (LexState *ls) {
15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  int old = ls->current;
15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  lua_assert(currIsNewline(ls));
15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  next(ls);  /* skip `\n' or `\r' */
15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  if (currIsNewline(ls) && ls->current != old)
15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    next(ls);  /* skip `\n\r' or `\r\n' */
15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  if (++ls->linenumber >= MAX_INT)
15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    luaX_syntaxerror(ls, "chunk has too many lines");
16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source,
16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                    int firstchar) {
16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  ls->decpoint = '.';
16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  ls->L = L;
16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  ls->current = firstchar;
16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  ls->lookahead.token = TK_EOS;  /* no look-ahead token */
16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  ls->z = z;
17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  ls->fs = NULL;
17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  ls->linenumber = 1;
17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  ls->lastline = 1;
17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  ls->source = source;
17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  ls->envn = luaS_new(L, LUA_ENV);  /* create env name */
17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  luaS_fix(ls->envn);  /* never collect this name */
17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER);  /* initialize buffer */
17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*
18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** =======================================================
18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** LEXICAL ANALYZER
18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** =======================================================
18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/
18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int check_next (LexState *ls, const char *set) {
19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  if (ls->current == '\0' || !strchr(set, ls->current))
19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    return 0;
19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  save_and_next(ls);
19376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  return 1;
19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
19776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*
19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** change all characters 'from' in buffer to 'to'
19976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/
20076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void buffreplace (LexState *ls, char from, char to) {
20176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  size_t n = luaZ_bufflen(ls->buff);
20276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  char *p = luaZ_buffer(ls->buff);
20376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  while (n--)
20476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (p[n] == from) p[n] = to;
20576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
20676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
20776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
20876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if !defined(getlocaledecpoint)
20976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define getlocaledecpoint()	(localeconv()->decimal_point[0])
21076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
21176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
21276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
21376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define buff2d(b,e)	luaO_str2d(luaZ_buffer(b), luaZ_bufflen(b) - 1, e)
21476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
21576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*
21676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** in case of format error, try to change decimal point separator to
21776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** the one defined in the current locale and check again
21876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/
21976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void trydecpoint (LexState *ls, SemInfo *seminfo) {
22076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  char old = ls->decpoint;
22176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  ls->decpoint = getlocaledecpoint();
22276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  buffreplace(ls, old, ls->decpoint);  /* try new decimal separator */
22376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  if (!buff2d(ls->buff, &seminfo->r)) {
22476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    /* format error with correct decimal point: no more options */
22576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    buffreplace(ls, ls->decpoint, '.');  /* undo change (for error message) */
22676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    lexerror(ls, "malformed number", TK_NUMBER);
22776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  }
22876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
22976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
23076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
23176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* LUA_NUMBER */
23276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*
23376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** this function is quite liberal in what it accepts, as 'luaO_str2d'
23476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** will reject ill-formed numerals.
23576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/
23676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void read_numeral (LexState *ls, SemInfo *seminfo) {
23776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  const char *expo = "Ee";
23876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  int first = ls->current;
23976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  lua_assert(lisdigit(ls->current));
24076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  save_and_next(ls);
24176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  if (first == '0' && check_next(ls, "Xx"))  /* hexadecimal? */
24276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    expo = "Pp";
24376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  for (;;) {
24476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (check_next(ls, expo))  /* exponent part? */
24576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      check_next(ls, "+-");  /* optional exponent sign */
24676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (lisxdigit(ls->current) || ls->current == '.')
24776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      save_and_next(ls);
24876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    else  break;
24976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  }
25076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  save(ls, '\0');
25176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  buffreplace(ls, '.', ls->decpoint);  /* follow locale for decimal point */
25276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  if (!buff2d(ls->buff, &seminfo->r))  /* format error? */
25376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    trydecpoint(ls, seminfo); /* try to update decimal point separator */
25476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
25576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
25676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
25776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*
25876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** skip a sequence '[=*[' or ']=*]' and return its number of '='s or
25976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** -1 if sequence is malformed
26076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/
26176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int skip_sep (LexState *ls) {
26276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  int count = 0;
26376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  int s = ls->current;
26476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  lua_assert(s == '[' || s == ']');
26576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  save_and_next(ls);
26676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  while (ls->current == '=') {
26776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    save_and_next(ls);
26876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    count++;
26976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  }
27076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  return (ls->current == s) ? count : (-count) - 1;
27176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
27276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
27376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
27476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void read_long_string (LexState *ls, SemInfo *seminfo, int sep) {
27576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  save_and_next(ls);  /* skip 2nd `[' */
27676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  if (currIsNewline(ls))  /* string starts with a newline? */
27776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    inclinenumber(ls);  /* skip it */
27876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  for (;;) {
27976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    switch (ls->current) {
28076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      case EOZ:
28176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        lexerror(ls, (seminfo) ? "unfinished long string" :
28276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                                 "unfinished long comment", TK_EOS);
28376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        break;  /* to avoid warnings */
28476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      case ']': {
28576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if (skip_sep(ls) == sep) {
28676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          save_and_next(ls);  /* skip 2nd `]' */
28776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          goto endloop;
28876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        }
28976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        break;
29076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
29176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      case '\n': case '\r': {
29276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        save(ls, '\n');
29376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        inclinenumber(ls);
29476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if (!seminfo) luaZ_resetbuffer(ls->buff);  /* avoid wasting space */
29576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        break;
29676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
29776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      default: {
29876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if (seminfo) save_and_next(ls);
29976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        else next(ls);
30076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
30176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    }
30276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  } endloop:
30376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  if (seminfo)
30476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + (2 + sep),
30576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                                     luaZ_bufflen(ls->buff) - 2*(2 + sep));
30676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
30776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
30876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
30976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void escerror (LexState *ls, int *c, int n, const char *msg) {
31076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  int i;
31176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  luaZ_resetbuffer(ls->buff);  /* prepare error message */
31276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  save(ls, '\\');
31376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  for (i = 0; i < n && c[i] != EOZ; i++)
31476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    save(ls, c[i]);
31576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  lexerror(ls, msg, TK_STRING);
31676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
31776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
31876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
31976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int readhexaesc (LexState *ls) {
32076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  int c[3], i;  /* keep input for error message */
32176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  int r = 0;  /* result accumulator */
32276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  c[0] = 'x';  /* for error message */
32376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  for (i = 1; i < 3; i++) {  /* read two hexadecimal digits */
32476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    c[i] = next(ls);
32576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (!lisxdigit(c[i]))
32676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      escerror(ls, c, i + 1, "hexadecimal digit expected");
32776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    r = (r << 4) + luaO_hexavalue(c[i]);
32876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  }
32976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  return r;
33076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
33176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
33276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
33376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int readdecesc (LexState *ls) {
33476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  int c[3], i;
33576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  int r = 0;  /* result accumulator */
33676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  for (i = 0; i < 3 && lisdigit(ls->current); i++) {  /* read up to 3 digits */
33776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    c[i] = ls->current;
33876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    r = 10*r + c[i] - '0';
33976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    next(ls);
34076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  }
34176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  if (r > UCHAR_MAX)
34276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    escerror(ls, c, i, "decimal escape too large");
34376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  return r;
34476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
34576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
34676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
34776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void read_string (LexState *ls, int del, SemInfo *seminfo) {
34876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  save_and_next(ls);  /* keep delimiter (for error messages) */
34976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  while (ls->current != del) {
35076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    switch (ls->current) {
35176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      case EOZ:
35276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        lexerror(ls, "unfinished string", TK_EOS);
35376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        break;  /* to avoid warnings */
35476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      case '\n':
35576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      case '\r':
35676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        lexerror(ls, "unfinished string", TK_STRING);
35776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        break;  /* to avoid warnings */
35876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      case '\\': {  /* escape sequences */
35976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        int c;  /* final character to be saved */
36076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        next(ls);  /* do not save the `\' */
36176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        switch (ls->current) {
36276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          case 'a': c = '\a'; goto read_save;
36376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          case 'b': c = '\b'; goto read_save;
36476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          case 'f': c = '\f'; goto read_save;
36576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          case 'n': c = '\n'; goto read_save;
36676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          case 'r': c = '\r'; goto read_save;
36776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          case 't': c = '\t'; goto read_save;
36876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          case 'v': c = '\v'; goto read_save;
36976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          case 'x': c = readhexaesc(ls); goto read_save;
37076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          case '\n': case '\r':
37176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            inclinenumber(ls); c = '\n'; goto only_save;
37276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          case '\\': case '\"': case '\'':
37376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            c = ls->current; goto read_save;
37476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          case EOZ: goto no_save;  /* will raise an error next loop */
37576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          case 'z': {  /* zap following span of spaces */
37676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            next(ls);  /* skip the 'z' */
37776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            while (lisspace(ls->current)) {
37876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman              if (currIsNewline(ls)) inclinenumber(ls);
37976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman              else next(ls);
38076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            }
38176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            goto no_save;
38276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          }
38376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          default: {
38476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            if (!lisdigit(ls->current))
38576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman              escerror(ls, &ls->current, 1, "invalid escape sequence");
38676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            /* digital escape \ddd */
38776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            c = readdecesc(ls);
38876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            goto only_save;
38976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          }
39076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        }
39176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman       read_save: next(ls);  /* read next character */
39276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman       only_save: save(ls, c);  /* save 'c' */
39376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman       no_save: break;
39476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
39576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      default:
39676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        save_and_next(ls);
39776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    }
39876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  }
39976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  save_and_next(ls);  /* skip delimiter */
40076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + 1,
40176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                                   luaZ_bufflen(ls->buff) - 2);
40276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
40376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
40476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
40576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int llex (LexState *ls, SemInfo *seminfo) {
40676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  luaZ_resetbuffer(ls->buff);
40776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  for (;;) {
40876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    switch (ls->current) {
40976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      case '\n': case '\r': {  /* line breaks */
41076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        inclinenumber(ls);
41176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        break;
41276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
41376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      case ' ': case '\f': case '\t': case '\v': {  /* spaces */
41476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        next(ls);
41576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        break;
41676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
41776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      case '-': {  /* '-' or '--' (comment) */
41876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        next(ls);
41976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if (ls->current != '-') return '-';
42076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        /* else is a comment */
42176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        next(ls);
42276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if (ls->current == '[') {  /* long comment? */
42376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          int sep = skip_sep(ls);
42476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          luaZ_resetbuffer(ls->buff);  /* `skip_sep' may dirty the buffer */
42576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          if (sep >= 0) {
42676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            read_long_string(ls, NULL, sep);  /* skip long comment */
42776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            luaZ_resetbuffer(ls->buff);  /* previous call may dirty the buff. */
42876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            break;
42976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          }
43076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        }
43176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        /* else short comment */
43276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        while (!currIsNewline(ls) && ls->current != EOZ)
43376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          next(ls);  /* skip until end of line (or end of file) */
43476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        break;
43576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
43676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      case '[': {  /* long string or simply '[' */
43776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        int sep = skip_sep(ls);
43876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if (sep >= 0) {
43976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          read_long_string(ls, seminfo, sep);
44076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          return TK_STRING;
44176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        }
44276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        else if (sep == -1) return '[';
44376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        else lexerror(ls, "invalid long string delimiter", TK_STRING);
44476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
44576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      case '=': {
44676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        next(ls);
44776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if (ls->current != '=') return '=';
44876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        else { next(ls); return TK_EQ; }
44976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
45076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      case '<': {
45176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        next(ls);
45276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if (ls->current != '=') return '<';
45376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        else { next(ls); return TK_LE; }
45476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
45576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      case '>': {
45676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        next(ls);
45776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if (ls->current != '=') return '>';
45876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        else { next(ls); return TK_GE; }
45976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
46076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      case '~': {
46176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        next(ls);
46276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if (ls->current != '=') return '~';
46376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        else { next(ls); return TK_NE; }
46476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
46576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      case ':': {
46676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        next(ls);
46776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if (ls->current != ':') return ':';
46876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        else { next(ls); return TK_DBCOLON; }
46976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
47076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      case '"': case '\'': {  /* short literal strings */
47176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        read_string(ls, ls->current, seminfo);
47276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        return TK_STRING;
47376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
47476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      case '.': {  /* '.', '..', '...', or number */
47576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        save_and_next(ls);
47676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if (check_next(ls, ".")) {
47776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          if (check_next(ls, "."))
47876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            return TK_DOTS;   /* '...' */
47976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          else return TK_CONCAT;   /* '..' */
48076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        }
48176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        else if (!lisdigit(ls->current)) return '.';
48276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        /* else go through */
48376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
48476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      case '0': case '1': case '2': case '3': case '4':
48576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      case '5': case '6': case '7': case '8': case '9': {
48676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        read_numeral(ls, seminfo);
48776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        return TK_NUMBER;
48876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
48976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      case EOZ: {
49076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        return TK_EOS;
49176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
49276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      default: {
49376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if (lislalpha(ls->current)) {  /* identifier or reserved word? */
49476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          TString *ts;
49576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          do {
49676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            save_and_next(ls);
49776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          } while (lislalnum(ls->current));
49876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          ts = luaX_newstring(ls, luaZ_buffer(ls->buff),
49976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                                  luaZ_bufflen(ls->buff));
50076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          seminfo->ts = ts;
50176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          if (isreserved(ts))  /* reserved word? */
50276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            return ts->tsv.extra - 1 + FIRST_RESERVED;
50376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          else {
50476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            return TK_NAME;
50576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          }
50676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        }
50776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        else {  /* single-char tokens (+ - / ...) */
50876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          int c = ls->current;
50976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          next(ls);
51076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          return c;
51176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        }
51276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
51376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    }
51476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  }
51576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
51676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
51776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
51876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid luaX_next (LexState *ls) {
51976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  ls->lastline = ls->linenumber;
52076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  if (ls->lookahead.token != TK_EOS) {  /* is there a look-ahead token? */
52176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    ls->t = ls->lookahead;  /* use this one */
52276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    ls->lookahead.token = TK_EOS;  /* and discharge it */
52376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  }
52476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  else
52576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    ls->t.token = llex(ls, &ls->t.seminfo);  /* read next token */
52676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
52776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
52876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
52976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint luaX_lookahead (LexState *ls) {
53076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  lua_assert(ls->lookahead.token == TK_EOS);
53176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  ls->lookahead.token = llex(ls, &ls->lookahead.seminfo);
53276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  return ls->lookahead.token;
53376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
53476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
535