diff options
author | Peter Mikkelsen <peter@pmikkelsen.com> | 2021-06-30 14:04:15 +0000 |
---|---|---|
committer | Peter Mikkelsen <peter@pmikkelsen.com> | 2021-06-30 14:04:15 +0000 |
commit | ee4298a2cfbbd9e015cfc775d9d714a9f5035846 (patch) | |
tree | 8d6f4b139abf1a645e9e4fe0fba811f64b03839f /parser.c | |
parent | 79d1fe1cf2eb6748e2c12ffe9c36a678655302b1 (diff) |
Add a basic repl
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"); |