From c85de58a2047c4858825d03977e490db6168fbe3 Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Fri, 23 Jul 2021 00:50:18 +0000 Subject: Simplify parsing a bit, and make sure the prolog loader calls read_term with the correct module to pick up the correct operators --- parser.c | 92 +++++++--------------------------------------------------------- 1 file changed, 9 insertions(+), 83 deletions(-) (limited to 'parser.c') diff --git a/parser.c b/parser.c index 04b2b68..b00382d 100644 --- a/parser.c +++ b/parser.c @@ -52,67 +52,32 @@ Term *compound(void); Term *parseoperators(Term *); void match(int); void syntaxerror_parser(char *); -Term *prologtext(int); -void handlemoduledirective(Term *); -void handleopdirective(Term *); +Term *parseterm(void); Term * -parse(int fd, Biobuf *bio, int querymode) +parse(Biobuf *bio, Module *mod) { - if(bio == nil){ - fd = dup(fd, -1); - parsein = Bfdopen(fd, OREAD); - if(parsein == nil){ - print("Could not open file\n"); - return nil; - } - }else - parsein = bio; - + parsein = bio; + currentmod = mod; nexttoken(); - currentmod = getmodule(L"user"); - Term *result = prologtext(querymode); - if(querymode && result){ + Term *result = parseterm(); + if(result){ result = copyterm(result, &clausenr); clausenr++; } - if(!bio) - Bterm(parsein); - return result; } Term * -prologtext(int querymode) +parseterm(void) { if(lookahead.tag == EofTok) return nil; Term *t = fullterm(AtomTok, L".", nil); - if(lookahead.tag == AtomTok && runestrcmp(lookahead.text, L".") == 0){ - if(!querymode) - match(AtomTok); - }else - syntaxerror_parser("prologtext"); - - if(querymode) - return t; - - if(t->tag == CompoundTerm && runestrcmp(t->text, L":-") == 0 && t->arity == 1){ - Term *body = t->children; - if(runestrcmp(body->text, L"op") == 0 && body->arity == 3) - handleopdirective(body->children); - - t = prologtext(querymode); - }else if(t->tag == CompoundTerm && runestrcmp(t->text, L":-") == 0 && t->arity == 2){ - t->next = prologtext(querymode); - }else if(t->tag == AtomTerm || t->tag == CompoundTerm){ - t->next = prologtext(querymode); - }else{ - print("Expected directive or clause as toplevel\n"); - syntaxerror_parser("prologtext"); - } + if(lookahead.tag != AtomTok || runestrcmp(lookahead.text, L".") != 0) + syntaxerror_parser("parseterm"); return t; } @@ -572,42 +537,3 @@ syntaxerror_parser(char *where) print("Syntax error: Unexpected %d (%S) token in %s\n", lookahead.tag, lookahead.text, where); exits("syntax error"); } - -void -handleopdirective(Term *args) -{ - Term *levelt = args; - Term *typet = levelt->next; - Term *opt = typet->next; - if(levelt->tag == IntegerTerm - && levelt->ival >= 0 - && levelt->ival <= PrecedenceLevels - && typet->tag == AtomTerm - && opt->tag == AtomTerm){ - int level = levelt->ival; - Rune *spelling = opt->text; - int type = 0; - if(runestrcmp(typet->text, L"xf") == 0) - type = Xf; - else if(runestrcmp(typet->text, L"yf") == 0) - type = Yf; - else if(runestrcmp(typet->text, L"xfx") == 0) - type = Xfx; - else if(runestrcmp(typet->text, L"xfy") == 0) - type = Xfy; - else if(runestrcmp(typet->text, L"yfx") == 0) - type = Yfx; - else if(runestrcmp(typet->text, L"fy") == 0) - type = Fy; - else if(runestrcmp(typet->text, L"fx") == 0) - type = Fx; - if(type != 0){ - addoperator(level, type, spelling, currentmod); - return; - } - } - print("Malformed op directive with level=%S, type=%S, op=%S\n", - prettyprint(levelt, 0, 0, 0, currentmod), - prettyprint(typet, 0, 0, 0, currentmod), - prettyprint(opt, 0, 0, 0, currentmod)); -} \ No newline at end of file -- cgit v1.2.3