Поправљен memory-leak везан за лексерски део интерпретера

This commit is contained in:
kappa 2019-01-06 21:13:13 +01:00
parent e560ef8a3c
commit 0a28cfda01
4 changed files with 28 additions and 9 deletions

View file

@ -7,8 +7,8 @@ VERSION = 0.0
PREFIX = /usr/local PREFIX = /usr/local
# флегови за C компајлер и линкер # флегови за C компајлер и линкер
CFLAGS = -g -std=c99 -pedantic -Wall -O0 # CFLAGS = -g -std=c99 -pedantic -Wall -O0
# CFLAGS = -std=c99 -pedantic -Wall -O1 CFLAGS = -std=c99 -pedantic -Wall -O1
LDFLAGS = -lm -lc LDFLAGS = -lm -lc
CC = cc CC = cc

View file

@ -27,18 +27,17 @@ int main(int argc, char **argv)
} }
token *tokenList, *current; token *tokenList, *current;
current = tokenList = lexLine(input); current = tokenList = lexLine(input);
int i = 0; int i = 0;
while (current != NULL) while (current != NULL)
{ {
printf("Токен бр. %d: \"%s\", тип:%s\n", i, printf("Токен бр. %d: \"%s\", тип:%s\n", i, current->lexeme, current->type == number ? "number" : (current->type == symbol ? "symbol" : "parenthesis"));
current->lexeme, current->type == number ? "number" : (current->type == symbol
? "symbol" : "parenthesis"));
current = current->next; current = current->next;
++i; ++i;
} }
freeLexedLine(tokenList);
free(input); free(input);
} }
} }

18
lexer.c
View file

@ -94,3 +94,21 @@ token *lex1Token(char *input, int *i)
return result; return result;
} }
void freeLexedLine(token *list)
{
if (list == NULL)
{
return;
}
else
{
freeLexedLine(list->next);
if (list->lexeme != NULL)
{
free(list->lexeme);
}
free(list);
return;
}
}

View file

@ -6,7 +6,7 @@ typedef enum
number, number,
symbol, symbol,
parenthesis parenthesis
} tokenType ; } tokenType;
typedef struct _Token typedef struct _Token
{ {
@ -15,6 +15,8 @@ typedef struct _Token
struct _Token *next; struct _Token *next;
} token; } token;
/* функција lexLine као аргумент добија ред са стандардног улаза, а као излаз
враћа лексичке елементе у повезаној листи */
token *lexLine(char *input); token *lexLine(char *input);
/* као аргумент добија ред са стандардног улаза, а као излаз
враћа лексичке елементе у повезаној листи */
void freeLexedLine(token *list);
/* ослобађа меморију коју је заузела листа токена узета из корисничког улаза */