diff options
author | Peter Mikkelsen <peter@pmikkelsen.com> | 2021-06-29 18:21:31 +0000 |
---|---|---|
committer | Peter Mikkelsen <peter@pmikkelsen.com> | 2021-06-29 18:21:31 +0000 |
commit | 50768fba487e1ec08278cdc4be614863db32a5c4 (patch) | |
tree | 79f0e2f6724d2311a298fd58cab4e60a81c4c43b /parser.c | |
parent | 64a411ede2df42eea0e6905a4985a3e54057c677 (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.c | 36 |
1 files changed, 16 insertions, 20 deletions
@@ -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; } |