summaryrefslogtreecommitdiff
path: root/parser.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <peter@pmikkelsen.com>2021-07-23 00:50:18 +0000
committerPeter Mikkelsen <peter@pmikkelsen.com>2021-07-23 00:50:18 +0000
commitc85de58a2047c4858825d03977e490db6168fbe3 (patch)
tree8856e5d3e8ac67ca9404bd6b0541d3652f37973d /parser.c
parent43f65cbe02b3a2512c3a797862196d693b3a9f11 (diff)
Simplify parsing a bit, and make sure the prolog loader calls read_term with the correct module to pick up the correct operators
Diffstat (limited to 'parser.c')
-rw-r--r--parser.c92
1 files changed, 9 insertions, 83 deletions
diff --git a/parser.c b/parser.c
index 04b2b68..b00382d 100644
--- a/parser.c
+++ b/parser.c
@@ -52,67 +52,32 @@ Term *compound(void);
Term *parseoperators(Term *);
void match(int);
void syntaxerror_parser(char *);
-Term *prologtext(int);
-void handlemoduledirective(Term *);
-void handleopdirective(Term *);
+Term *parseterm(void);
Term *
-parse(int fd, Biobuf *bio, int querymode)
+parse(Biobuf *bio, Module *mod)
{
- if(bio == nil){
- fd = dup(fd, -1);
- parsein = Bfdopen(fd, OREAD);
- if(parsein == nil){
- print("Could not open file\n");
- return nil;
- }
- }else
- parsein = bio;
-
+ parsein = bio;
+ currentmod = mod;
nexttoken();
- currentmod = getmodule(L"user");
- Term *result = prologtext(querymode);
- if(querymode && result){
+ Term *result = parseterm();
+ if(result){
result = copyterm(result, &clausenr);
clausenr++;
}
- if(!bio)
- Bterm(parsein);
-
return result;
}
Term *
-prologtext(int querymode)
+parseterm(void)
{
if(lookahead.tag == EofTok)
return nil;
Term *t = fullterm(AtomTok, L".", nil);
- if(lookahead.tag == AtomTok && runestrcmp(lookahead.text, L".") == 0){
- if(!querymode)
- match(AtomTok);
- }else
- syntaxerror_parser("prologtext");
-
- if(querymode)
- return t;
-
- if(t->tag == CompoundTerm && runestrcmp(t->text, L":-") == 0 && t->arity == 1){
- Term *body = t->children;
- if(runestrcmp(body->text, L"op") == 0 && body->arity == 3)
- handleopdirective(body->children);
-
- t = prologtext(querymode);
- }else if(t->tag == CompoundTerm && runestrcmp(t->text, L":-") == 0 && t->arity == 2){
- t->next = prologtext(querymode);
- }else if(t->tag == AtomTerm || t->tag == CompoundTerm){
- t->next = prologtext(querymode);
- }else{
- print("Expected directive or clause as toplevel\n");
- syntaxerror_parser("prologtext");
- }
+ if(lookahead.tag != AtomTok || runestrcmp(lookahead.text, L".") != 0)
+ syntaxerror_parser("parseterm");
return t;
}
@@ -572,42 +537,3 @@ syntaxerror_parser(char *where)
print("Syntax error: Unexpected %d (%S) token in %s\n", lookahead.tag, lookahead.text, where);
exits("syntax error");
}
-
-void
-handleopdirective(Term *args)
-{
- Term *levelt = args;
- Term *typet = levelt->next;
- Term *opt = typet->next;
- if(levelt->tag == IntegerTerm
- && levelt->ival >= 0
- && levelt->ival <= PrecedenceLevels
- && typet->tag == AtomTerm
- && opt->tag == AtomTerm){
- int level = levelt->ival;
- Rune *spelling = opt->text;
- int type = 0;
- if(runestrcmp(typet->text, L"xf") == 0)
- type = Xf;
- else if(runestrcmp(typet->text, L"yf") == 0)
- type = Yf;
- else if(runestrcmp(typet->text, L"xfx") == 0)
- type = Xfx;
- else if(runestrcmp(typet->text, L"xfy") == 0)
- type = Xfy;
- else if(runestrcmp(typet->text, L"yfx") == 0)
- type = Yfx;
- else if(runestrcmp(typet->text, L"fy") == 0)
- type = Fy;
- else if(runestrcmp(typet->text, L"fx") == 0)
- type = Fx;
- if(type != 0){
- addoperator(level, type, spelling, currentmod);
- return;
- }
- }
- print("Malformed op directive with level=%S, type=%S, op=%S\n",
- prettyprint(levelt, 0, 0, 0, currentmod),
- prettyprint(typet, 0, 0, 0, currentmod),
- prettyprint(opt, 0, 0, 0, currentmod));
-} \ No newline at end of file