From 348cc491130b1a861d4ed86c8515adc37b6427e2 Mon Sep 17 00:00:00 2001 From: Jakob Kaivo Date: Fri, 13 Mar 2020 10:24:40 -0400 Subject: parse all of the definitions section --- lex.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/lex.c b/lex.c index d5e8e56..0cdd1c4 100644 --- a/lex.c +++ b/lex.c @@ -1,5 +1,6 @@ #define _XOPEN_SOURCE 700 +#include #include #include #include @@ -28,6 +29,11 @@ #define MIN_CLASSES 1000 #define MIN_OUTPUTSIZE 3000 +struct definition { + char *name; + char *substitute; +}; + struct parser { enum { UNSPECIFIED, POINTER, ARRAY } yytexttype; int maxpositions; @@ -48,10 +54,17 @@ struct parser { char *top; char *init; char *bottom; + + size_t ndefs; + char *defs; }; char *append(char *buf, const char *add) { + if (buf == NULL) { + return strdup(add); + } + size_t oldlen = buf ? strlen(buf) : 0; size_t newlen = strlen(add); char *tmp = realloc(buf, oldlen + newlen); @@ -64,6 +77,66 @@ char *append(char *buf, const char *add) return buf; } +static int add_directive(struct parser *p, const char *buf) +{ + if (!strcmp(buf, "%array\n")) { + p->yytexttype = ARRAY; + return 1; + } + + if (!strcmp(buf, "%pointer\n")) { + p->yytexttype = POINTER; + return 1; + } + + switch (buf[1]) { + case 'p': + p->npositions = atoi(buf + 2); + break; + + case 'n': + p->nstates = atoi(buf + 2); + break; + + case 'a': + p->ntransitions = atoi(buf + 2); + break; + + case 'e': + p->nnodes = atoi(buf + 2); + break; + + case 'k': + p->nclasses = atoi(buf + 2); + break; + + case 'o': + p->outputsize = atoi(buf + 2); + break; + + case 'x': + case 'X': + /* exclusive start condition */ + break; + + case 's': + case 'S': + /* start condition */ + break; + + default: + return 0; + } + + return 1; +} + +static int add_definition(struct parser *p, const char *buf) +{ + (void)p; (void)buf; + return 1; +} + struct parser *parse(struct parser *parser, const char *file) { struct parser p = {0}; @@ -109,6 +182,15 @@ struct parser *parse(struct parser *parser, const char *file) } line++; RESETLINE(p.top); + } else if (isblank(buf[0])) { + MAYBEADDLINE(p.top, line, file); + } else if (buf[0] == '%') { + if (!add_directive(&p, buf)) { + fprintf(stderr, "lex: %s:%d: unknown directive %s", file, line, buf); + return NULL; + } + } else { + add_definition(&p, buf); } } else if (section == RULES) { if (!strcmp("%%\n", buf)) { -- cgit v1.2.1