aboutsummaryrefslogtreecommitdiff
path: root/llex.c
diff options
context:
space:
mode:
Diffstat (limited to 'llex.c')
-rw-r--r--llex.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/llex.c b/llex.c
index 5a6aa616..d6c51acc 100644
--- a/llex.c
+++ b/llex.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: llex.c,v 2.26 2007/08/09 20:29:15 roberto Exp roberto $ 2** $Id: llex.c,v 2.27 2007/09/14 13:27:04 roberto Exp roberto $
3** Lexical Analyzer 3** Lexical Analyzer
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -47,12 +47,15 @@ static const char *const luaX_tokens [] = {
47#define save_and_next(ls) (save(ls, ls->current), next(ls)) 47#define save_and_next(ls) (save(ls, ls->current), next(ls))
48 48
49 49
50static void lexerror (LexState *ls, const char *msg, int token);
51
52
50static void save (LexState *ls, int c) { 53static void save (LexState *ls, int c) {
51 Mbuffer *b = ls->buff; 54 Mbuffer *b = ls->buff;
52 if (b->n + 1 > b->buffsize) { 55 if (b->n + 1 > b->buffsize) {
53 size_t newsize; 56 size_t newsize;
54 if (b->buffsize >= MAX_SIZET/2) 57 if (b->buffsize >= MAX_SIZET/2)
55 luaX_lexerror(ls, "lexical element too long", 0); 58 lexerror(ls, "lexical element too long", 0);
56 newsize = b->buffsize * 2; 59 newsize = b->buffsize * 2;
57 luaZ_resizebuffer(ls->L, b, newsize); 60 luaZ_resizebuffer(ls->L, b, newsize);
58 } 61 }
@@ -103,7 +106,7 @@ static const char *txtToken (LexState *ls, int token) {
103} 106}
104 107
105 108
106void luaX_lexerror (LexState *ls, const char *msg, int token) { 109static void lexerror (LexState *ls, const char *msg, int token) {
107 char buff[MAXSRC]; 110 char buff[MAXSRC];
108 luaO_chunkid(buff, getstr(ls->source), MAXSRC); 111 luaO_chunkid(buff, getstr(ls->source), MAXSRC);
109 msg = luaO_pushfstring(ls->L, "%s:%d: %s", buff, ls->linenumber, msg); 112 msg = luaO_pushfstring(ls->L, "%s:%d: %s", buff, ls->linenumber, msg);
@@ -114,7 +117,7 @@ void luaX_lexerror (LexState *ls, const char *msg, int token) {
114 117
115 118
116void luaX_syntaxerror (LexState *ls, const char *msg) { 119void luaX_syntaxerror (LexState *ls, const char *msg) {
117 luaX_lexerror(ls, msg, ls->t.token); 120 lexerror(ls, msg, ls->t.token);
118} 121}
119 122
120 123
@@ -193,7 +196,7 @@ static void trydecpoint (LexState *ls, SemInfo *seminfo) {
193 if (!luaO_str2d(luaZ_buffer(ls->buff), &seminfo->r)) { 196 if (!luaO_str2d(luaZ_buffer(ls->buff), &seminfo->r)) {
194 /* format error with correct decimal point: no more options */ 197 /* format error with correct decimal point: no more options */
195 buffreplace(ls, ls->decpoint, '.'); /* undo change (for error message) */ 198 buffreplace(ls, ls->decpoint, '.'); /* undo change (for error message) */
196 luaX_lexerror(ls, "malformed number", TK_NUMBER); 199 lexerror(ls, "malformed number", TK_NUMBER);
197 } 200 }
198} 201}
199 202
@@ -235,8 +238,8 @@ static void read_long_string (LexState *ls, SemInfo *seminfo, int sep) {
235 for (;;) { 238 for (;;) {
236 switch (ls->current) { 239 switch (ls->current) {
237 case EOZ: 240 case EOZ:
238 luaX_lexerror(ls, (seminfo) ? "unfinished long string" : 241 lexerror(ls, (seminfo) ? "unfinished long string" :
239 "unfinished long comment", TK_EOS); 242 "unfinished long comment", TK_EOS);
240 break; /* to avoid warnings */ 243 break; /* to avoid warnings */
241 case ']': { 244 case ']': {
242 if (skip_sep(ls) == sep) { 245 if (skip_sep(ls) == sep) {
@@ -269,11 +272,11 @@ static void read_string (LexState *ls, int del, SemInfo *seminfo) {
269 while (ls->current != del) { 272 while (ls->current != del) {
270 switch (ls->current) { 273 switch (ls->current) {
271 case EOZ: 274 case EOZ:
272 luaX_lexerror(ls, "unfinished string", TK_EOS); 275 lexerror(ls, "unfinished string", TK_EOS);
273 continue; /* to avoid warnings */ 276 continue; /* to avoid warnings */
274 case '\n': 277 case '\n':
275 case '\r': 278 case '\r':
276 luaX_lexerror(ls, "unfinished string", TK_STRING); 279 lexerror(ls, "unfinished string", TK_STRING);
277 continue; /* to avoid warnings */ 280 continue; /* to avoid warnings */
278 case '\\': { 281 case '\\': {
279 int c; 282 int c;
@@ -300,7 +303,7 @@ static void read_string (LexState *ls, int del, SemInfo *seminfo) {
300 next(ls); 303 next(ls);
301 } while (++i<3 && isdigit(ls->current)); 304 } while (++i<3 && isdigit(ls->current));
302 if (c > UCHAR_MAX) 305 if (c > UCHAR_MAX)
303 luaX_lexerror(ls, "escape sequence too large", TK_STRING); 306 lexerror(ls, "escape sequence too large", TK_STRING);
304 save(ls, c); 307 save(ls, c);
305 } 308 }
306 continue; 309 continue;
@@ -355,7 +358,7 @@ static int llex (LexState *ls, SemInfo *seminfo) {
355 return TK_STRING; 358 return TK_STRING;
356 } 359 }
357 else if (sep == -1) return '['; 360 else if (sep == -1) return '[';
358 else luaX_lexerror(ls, "invalid long string delimiter", TK_STRING); 361 else lexerror(ls, "invalid long string delimiter", TK_STRING);
359 } 362 }
360 case '=': { 363 case '=': {
361 next(ls); 364 next(ls);