summaryrefslogtreecommitdiff
path: root/parser.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <peter@pmikkelsen.com>2021-06-30 14:04:15 +0000
committerPeter Mikkelsen <peter@pmikkelsen.com>2021-06-30 14:04:15 +0000
commitee4298a2cfbbd9e015cfc775d9d714a9f5035846 (patch)
tree8d6f4b139abf1a645e9e4fe0fba811f64b03839f /parser.c
parent79d1fe1cf2eb6748e2c12ffe9c36a678655302b1 (diff)
Add a basic repl
Diffstat (limited to 'parser.c')
-rw-r--r--parser.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/parser.c b/parser.c
index 63da254..18573b7 100644
--- a/parser.c
+++ b/parser.c
@@ -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");