summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Phillips <david@sighup.nz>2018-08-01 21:07:02 +1200
committerDavid Phillips <david@sighup.nz>2018-08-01 21:07:02 +1200
commitdd1d26f7332f60439142ef384a2bb217d42240a8 (patch)
treeadf74aa941dd3260adaf85f9e93a6c13ef5bef91
parent9a3927f494bb7bfd26c7b5cd4b0c4a3fe4ed8f61 (diff)
downloadhence-dd1d26f7332f60439142ef384a2bb217d42240a8.tar.xz
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
-rw-r--r--parser.c37
1 files changed, 20 insertions, 17 deletions
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) {