summaryrefslogtreecommitdiff
path: root/parser.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <peter@pmikkelsen.com>2021-06-29 18:21:31 +0000
committerPeter Mikkelsen <peter@pmikkelsen.com>2021-06-29 18:21:31 +0000
commit50768fba487e1ec08278cdc4be614863db32a5c4 (patch)
tree79f0e2f6724d2311a298fd58cab4e60a81c4c43b /parser.c
parent64a411ede2df42eea0e6905a4985a3e54057c677 (diff)
Make parse return a list of clauses. Also pretty print the entire list of clauses.
Diffstat (limited to 'parser.c')
-rw-r--r--parser.c36
1 files changed, 16 insertions, 20 deletions
diff --git a/parser.c b/parser.c
index c4d860e..f3dd7aa 100644
--- a/parser.c
+++ b/parser.c
@@ -7,9 +7,6 @@
#define PrecedenceLevels 1200
-/* The parser doesn't produce an ast for now, it only acts like a recognizer,
- printing errors if it fails */
-
typedef struct Token Token;
typedef struct Operator Operator;
typedef struct OpInfo OpInfo;
@@ -79,50 +76,48 @@ Term *compound(void);
Term *parseoperators(Term *);
void match(int);
void syntaxerror(char *);
-void prologtext(void);
+Term *prologtext(void);
-void
+Term *
parse(int fd)
{
parsein = Bfdopen(fd, OREAD);
if(parsein == nil){
print("Could not open file\n");
- return;
+ return nil;
}
initoperators();
nexttoken();
- prologtext();
+ return prologtext();
}
-void
+Term *
prologtext(void)
{
if(lookahead.tag == EofTok)
- return;
+ return nil;
Term *t = fullterm(AtomTok, L".", nil);
+ if(lookahead.tag == AtomTok && runestrcmp(lookahead.text, L".") == 0)
+ match(AtomTok);
+ else
+ syntaxerror("prologtext");
if(t->tag == CompoundTerm && runestrcmp(t->text, L":-") == 0 && t->arity == 1){
/* A Directive */
print("Got directive: %S\n", prettyprint(t));
+ t = prologtext();
}else if(t->tag == CompoundTerm && runestrcmp(t->text, L":-") == 0 && t->arity == 2){
- /* A clause with a body */
- print("Got clause with body: %S\n", prettyprint(t));
+ t->next = prologtext();
}else if(t->tag == AtomTerm || t->tag == CompoundTerm){
- /* A clause without a body */
- print("Got clause without body: %S\n", prettyprint(t));
+ t->next = prologtext();
}else{
print("Expected directive or clause as toplevel\n");
syntaxerror("prologtext");
}
- if(lookahead.tag == AtomTok && runestrcmp(lookahead.text, L".") == 0)
- match(AtomTok);
- else
- syntaxerror("prologtext");
-
- prologtext();
+ return t;
}
Term *
@@ -567,7 +562,7 @@ Integer:
}
/* Other */
- if(runestrchr(L",.()]}|", peek)){
+ if(runestrchr(L",.()]}|!", peek)){
switch(peek){
case L',': lookahead.tag = CommaTok; break;
case L'(': lookahead.tag = ParenLeftTok; break;
@@ -575,6 +570,7 @@ Integer:
case L']': lookahead.tag = SquareBracketRightTok; break;
case L'}': lookahead.tag = CurlyBracketRightTok; break;
case L'|': lookahead.tag = PipeTok; break;
+ case L'!': lookahead.tag = AtomTok; lookahead.text = runestrdup(L"!"); break;
}
return;
}