diff options
Diffstat (limited to 'parser.c')
-rw-r--r-- | parser.c | 24 |
1 files changed, 14 insertions, 10 deletions
@@ -76,10 +76,10 @@ Term *compound(void); Term *parseoperators(Term *); void match(int); void syntaxerror(char *); -Term *prologtext(void); +Term *prologtext(int); Term * -parse(int fd) +parse(int fd, int querymode) { parsein = Bfdopen(fd, OREAD); if(parsein == nil){ @@ -90,21 +90,25 @@ parse(int fd) initoperators(); nexttoken(); - return prologtext(); + return prologtext(querymode); } Term * -prologtext(void) +prologtext(int querymode) { if(lookahead.tag == EofTok) return nil; Term *t = fullterm(AtomTok, L".", nil); - if(lookahead.tag == AtomTok && runestrcmp(lookahead.text, L".") == 0) - match(AtomTok); - else + if(lookahead.tag == AtomTok && runestrcmp(lookahead.text, L".") == 0){ + if(!querymode) + match(AtomTok); + }else syntaxerror("prologtext"); + if(querymode) + return t; + if(t->tag == CompoundTerm && runestrcmp(t->text, L":-") == 0 && t->arity == 1){ Term *body = t->children; print("Got directive: %S\n", prettyprint(body)); @@ -113,11 +117,11 @@ prologtext(void) initgoals = body->children; initgoals->next = tmp; } - t = prologtext(); + t = prologtext(querymode); }else if(t->tag == CompoundTerm && runestrcmp(t->text, L":-") == 0 && t->arity == 2){ - t->next = prologtext(); + t->next = prologtext(querymode); }else if(t->tag == AtomTerm || t->tag == CompoundTerm){ - t->next = prologtext(); + t->next = prologtext(querymode); }else{ print("Expected directive or clause as toplevel\n"); syntaxerror("prologtext"); |