Remove asserts, replace fixed size lexer_buf.
This commit is contained in:
parent
d425beb557
commit
aff20b9db1
|
|
@ -138,18 +138,19 @@ static void print_sym_tab(SYM_TAB t, BOOL with_addr)
|
||||||
/* End of btree symbol table */
|
/* End of btree symbol table */
|
||||||
|
|
||||||
/* Start of lexical scanner */
|
/* Start of lexical scanner */
|
||||||
#include <assert.h>
|
|
||||||
#define LEX_ID 256
|
#define LEX_ID 256
|
||||||
#define LEX_OTHER 257
|
#define LEX_OTHER 257
|
||||||
#define LEX_BUF_SZ 512
|
#define LEX_BUF_SZ 512
|
||||||
|
#define LEX_INIT_SZ 128
|
||||||
|
|
||||||
typedef struct lexer *LEXER;
|
typedef struct lexer *LEXER;
|
||||||
struct lexer {
|
struct lexer {
|
||||||
char lexer_buf[LEX_BUF_SZ];
|
char *lexer_buf;
|
||||||
char *lexer_line;
|
char *lexer_line;
|
||||||
int lexer_pos;
|
int lexer_pos;
|
||||||
int lexer_back;
|
int lexer_back;
|
||||||
SYM_TAB lexer_sym_tab;
|
SYM_TAB lexer_sym_tab;
|
||||||
|
size_t lexer_blen;
|
||||||
};
|
};
|
||||||
|
|
||||||
static LEXER parse_lexer = NULL;
|
static LEXER parse_lexer = NULL;
|
||||||
|
|
@ -161,7 +162,9 @@ static LEXER new_lexer(char *line)
|
||||||
lx->lexer_line = TMALLOC(char, (strlen(line) + 1));
|
lx->lexer_line = TMALLOC(char, (strlen(line) + 1));
|
||||||
strcpy(lx->lexer_line, line);
|
strcpy(lx->lexer_line, line);
|
||||||
lx->lexer_pos = lx->lexer_back = 0;
|
lx->lexer_pos = lx->lexer_back = 0;
|
||||||
lx->lexer_buf[0] = '\0';
|
lx->lexer_blen = LEX_INIT_SZ;
|
||||||
|
lx->lexer_buf = TMALLOC(char, lx->lexer_blen);
|
||||||
|
(void) memset(lx->lexer_buf, 0, lx->lexer_blen);
|
||||||
lx->lexer_sym_tab = NULL;
|
lx->lexer_sym_tab = NULL;
|
||||||
return lx;
|
return lx;
|
||||||
}
|
}
|
||||||
|
|
@ -170,6 +173,8 @@ static void delete_lexer(LEXER lx)
|
||||||
{
|
{
|
||||||
if (!lx)
|
if (!lx)
|
||||||
return;
|
return;
|
||||||
|
if (lx->lexer_buf)
|
||||||
|
tfree(lx->lexer_buf);
|
||||||
if (lx->lexer_line)
|
if (lx->lexer_line)
|
||||||
tfree(lx->lexer_line);
|
tfree(lx->lexer_line);
|
||||||
if (lx->lexer_sym_tab)
|
if (lx->lexer_sym_tab)
|
||||||
|
|
@ -321,14 +326,22 @@ static int lexer_scan(LEXER lx)
|
||||||
else if (lex_oper(c))
|
else if (lex_oper(c))
|
||||||
return c;
|
return c;
|
||||||
else if (lex_ident(c)) {
|
else if (lex_ident(c)) {
|
||||||
int i = 0;
|
size_t i = 0;
|
||||||
while (lex_ident(c)) {
|
while (lex_ident(c)) {
|
||||||
|
if (i >= lx->lexer_blen) {
|
||||||
|
lx->lexer_blen *= 2;
|
||||||
|
lx->lexer_buf =
|
||||||
|
TREALLOC(char, lx->lexer_buf, lx->lexer_blen);
|
||||||
|
}
|
||||||
lx->lexer_buf[i] = (char) c;
|
lx->lexer_buf[i] = (char) c;
|
||||||
assert(i < LEX_BUF_SZ);
|
|
||||||
i++;
|
i++;
|
||||||
c = lexer_getchar(lx);
|
c = lexer_getchar(lx);
|
||||||
}
|
}
|
||||||
assert(i < LEX_BUF_SZ);
|
if (i >= lx->lexer_blen) {
|
||||||
|
lx->lexer_blen *= 2;
|
||||||
|
lx->lexer_buf =
|
||||||
|
TREALLOC(char, lx->lexer_buf, lx->lexer_blen);
|
||||||
|
}
|
||||||
lx->lexer_buf[i] = '\0';
|
lx->lexer_buf[i] = '\0';
|
||||||
if (c != '\0')
|
if (c != '\0')
|
||||||
lexer_putback(lx);
|
lexer_putback(lx);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue