From dd1d26f7332f60439142ef384a2bb217d42240a8 Mon Sep 17 00:00:00 2001 From: David Phillips Date: Wed, 1 Aug 2018 21:07:02 +1200 Subject: Add more wrapper macros for expect Also renames EXPECT_AND_DISCARD to indicate that it also returns 1 on behalf of the "using" code if expect fails --- parser.c | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) (limited to 'parser.c') diff --git a/parser.c b/parser.c index 0317aab..a54ed7c 100644 --- a/parser.c +++ b/parser.c @@ -14,12 +14,17 @@ static FILE* fd; static struct token *cursor; static const char *filename; -#define EXPECT_AND_DISCARD(type)\ - do { \ - if (expect(type)) { \ - return 1; \ - } \ - kerchunk(); \ +#define EXPECT_AND_DISCARD_CRITICAL(type)\ + do { \ + EXPECT_CRITICAL(type) \ + kerchunk(); \ + } while (0); + +#define EXPECT_CRITICAL(type)\ + do { \ + if (expect(type)) { \ + return 1; \ + } \ } while (0); /* FIXME change to varadic fuction */ @@ -81,9 +86,9 @@ kerchunk() { int parse_expr(void) { /* FIXME write wrapper to exit on fail */ - EXPECT_AND_DISCARD(TOK_EXPR); - EXPECT_AND_DISCARD(TOK_IDENT); /* FIXME do something, don't discard */ - EXPECT_AND_DISCARD(TOK_COLON); + EXPECT_AND_DISCARD_CRITICAL(TOK_EXPR); + EXPECT_AND_DISCARD_CRITICAL(TOK_IDENT); /* FIXME do something, don't discard */ + EXPECT_AND_DISCARD_CRITICAL(TOK_COLON); switch(cursor->type) { /* FIXME do some things */ @@ -91,12 +96,12 @@ parse_expr(void) { case TOK_AND: /* fallthrough */ case TOK_XOR: kerchunk(); - EXPECT_AND_DISCARD(TOK_IDENT); /* FIXME don't discard */ - EXPECT_AND_DISCARD(TOK_IDENT); /* FIXME don't discard */ + EXPECT_AND_DISCARD_CRITICAL(TOK_IDENT); /* FIXME don't discard */ + EXPECT_AND_DISCARD_CRITICAL(TOK_IDENT); /* FIXME don't discard */ break; case TOK_NOT: kerchunk(); - EXPECT_AND_DISCARD(TOK_IDENT); /* FIXME don't discard */ + EXPECT_AND_DISCARD_CRITICAL(TOK_IDENT); /* FIXME don't discard */ break; default: emit("Error: Unexpected %s\n", get_token_description(cursor->type)); @@ -116,16 +121,14 @@ parse(const char *fname, FILE *f, struct token *t) { kerchunk(); } - EXPECT_AND_DISCARD(TOK_MODULE); + EXPECT_AND_DISCARD_CRITICAL(TOK_MODULE); - if (expect(TOK_IDENT)) { - return 1; - } + EXPECT_CRITICAL(TOK_IDENT); emit("Debug: module is named %s\n", cursor->value); /* FIXME do something */ kerchunk(); - EXPECT_AND_DISCARD(TOK_EOL); + EXPECT_AND_DISCARD_CRITICAL(TOK_EOL); while (cursor) { switch(cursor->type) { -- cgit v1.1