From d65bcc202f0129fd65490beee739a18848a6fba5 Mon Sep 17 00:00:00 2001 From: Augusto Gunsch Date: Tue, 22 Dec 2020 14:38:10 -0300 Subject: [PATCH] Fix parsing issues --- parser-expressions.c | 23 ++++++++++------------- parser-internal.h | 4 ++-- parser-statements.c | 17 ++++++----------- parser-structure.c | 10 ++-------- parser-tree.h | 1 - parser.c | 4 ++-- parser.h | 2 +- 7 files changed, 23 insertions(+), 38 deletions(-) diff --git a/parser-expressions.c b/parser-expressions.c index 474659f..27ef932 100644 --- a/parser-expressions.c +++ b/parser-expressions.c @@ -26,18 +26,12 @@ mkstrlist(operators, opsarr); TERM* parsetermnullified(PARSER* p) { TOKENTYPE type = p->current->type; - if(type == integer) - return parseint(p); - else if(type == string) - return parsestr(p); - else if(type == keyword) - return parsekeyword(p); - else if(type == identifier) - return parseidentifierterm(p); - else if(equals(p, "-") || equals(p, "~")) - return parseunaryopterm(p); - else if(equals(p, "(")) - return parseinnerexpression(p); + if(type == integer) return parseint(p); + if(type == string) return parsestr(p); + if(type == keyword) return parsekeyword(p); + if(type == identifier) return parseidentifierterm(p); + if(equals(p, "-") || equals(p, "~")) return parseunaryopterm(p); + if(equals(p, "(")) return parseinnerexpression(p); return NULL; } @@ -94,8 +88,10 @@ TERM* parseinnerexpression(PARSER* p) { } TERM* parsecalltermnullified(PARSER* p) { - TERM* t = mkterm(subroutcall); SUBROUTCALL* call = parsesubroutcallnullified(p); + if(call == NULL) + return NULL; + TERM* t = mkterm(subroutcall); t->call == call; return t; } @@ -184,6 +180,7 @@ SUBROUTCALL* parsesubroutcallnullified(PARSER* p) { if(p->current->type != identifier) return nullsubroutcall(p, c); c->name = p->current->token; + next(p); if(differs(p, "(")) return nullsubroutcall(p, c); diff --git a/parser-internal.h b/parser-internal.h index d1b4951..31d7a34 100644 --- a/parser-internal.h +++ b/parser-internal.h @@ -5,8 +5,8 @@ #define mkstrlist(name, array) STRINGARRAY name = { .items = array, .size = strcount(array) } #define next(parser) parser->current = p->current->next -#define rewindparser(parser) p->checkpoint = p->current -#define anchorparser(parser) p->current = p->checkpoint +#define anchorparser(parser) p->checkpoint = p->current +#define rewindparser(parser) p->current = p->checkpoint #define differs(parser, str) strcmp(parser->current->token, str) #define nextdiffers(parser, str) strcmp(parser->current->next->token, str) #define equals(parser, str) !differs(parser, str) diff --git a/parser-statements.c b/parser-statements.c index 625796b..97c0efc 100644 --- a/parser-statements.c +++ b/parser-statements.c @@ -18,18 +18,13 @@ STATEMENT* mkstatement(STATEMENTTYPE t) { return s; } -// Though nullified, will throw errors if the parsing was on-going +// Though nullified, will throw errors if the parsing fails while on-going STATEMENT* parsestatementnullified(PARSER* p) { - if(equals(p, "let")) - return parselet(p); - else if(equals(p, "if")) - return parseif(p); - else if(equals(p, "while")) - return parsewhile(p); - else if(equals(p, "do")) - return parsedo(p); - else if(equals(p, "return")) - return parsereturn(p); + if(equals(p, "let")) return parselet(p); + if(equals(p, "if")) return parseif(p); + if(equals(p, "while")) return parsewhile(p); + if(equals(p, "do")) return parsedo(p); + if(equals(p, "return")) return parsereturn(p); return NULL; } diff --git a/parser-structure.c b/parser-structure.c index 9d3eb8b..e8e8d6f 100644 --- a/parser-structure.c +++ b/parser-structure.c @@ -111,13 +111,7 @@ SUBROUTDEC* parsesubroutdec(PARSER* p) { SUBROUTDEC* subroutdec = (SUBROUTDEC*)malloc(sizeof(SUBROUTDEC)); subroutdec->subroutclass = subroutclass; - subroutdec->typeclass = p->current->type; - if(equals(p, "void")) { - subroutdec->type = p->current->token; - next(p); - } - else - subroutdec->type = parsetype(p); + subroutdec->type = parsetype(p); subroutdec->debug = getdebug(p); @@ -185,7 +179,7 @@ bool isprimitive(TOKEN* tk) { } char* parsetype(PARSER* p) { - if(p->current->type != identifier); + if(p->current->type != identifier) unexpected(p); char* result = p->current->token; diff --git a/parser-tree.h b/parser-tree.h index cbc6ccc..2525a14 100644 --- a/parser-tree.h +++ b/parser-tree.h @@ -50,7 +50,6 @@ typedef enum { typedef struct subroutdec { SUBROUTCLASS subroutclass; char* type; - TOKENTYPE typeclass; char* name; struct parameter* parameters; struct subroutbody* body; diff --git a/parser.c b/parser.c index 3d90ed7..dfd6187 100644 --- a/parser.c +++ b/parser.c @@ -14,6 +14,6 @@ PARSER* mkparser(TOKEN* tokens, char* file) { return parser; } -void parse(PARSER* parser) { - parser->output = parseclasses(parser); +void parse(PARSER* p) { + p->output = parseclasses(p); } diff --git a/parser.h b/parser.h index a8ad6c2..d4f27b4 100644 --- a/parser.h +++ b/parser.h @@ -12,5 +12,5 @@ typedef struct { } PARSER; PARSER* mkparser(TOKEN* tokens, char* file); -void parse(PARSER* parser); +void parse(PARSER* p); #endif