From 6eb5ea040f9ebc1a99953ff72c48ebe9f97f7f3c Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Sat, 6 Aug 2016 11:51:11 +0200 Subject: Ditch suffix; make prefix work better --- parser.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'parser.c') diff --git a/parser.c b/parser.c index 6cced13..b2bd68b 100644 --- a/parser.c +++ b/parser.c @@ -118,6 +118,14 @@ static Token nexttoken(const char **sourcep,bool expectop){ *sourcep+=oplen; return tok; } + if(!expectop){ + char buf[4]={'(',*source,')','\0'}; + if(precedence(buf)!=-1){ + Token tok={TT_OP,source,1}; + (*sourcep)++; + return tok; + } + } if(strchr("(){}",*source)!=NULL){ Token tok={TT_SYM,source,1}; (*sourcep)++; @@ -275,7 +283,7 @@ static AST* parseterm(const char *source,int *reslen){ node->o.op=opconststring_len(buf,tok.len+2); node->o.left=NULL; int len; - node->o.right=parseterm(source,&len); + node->o.right=parseexpr(source,&len,precedence(buf)); if(!node->o.right){ free(node); return NULL; @@ -290,6 +298,7 @@ static AST* parseterm(const char *source,int *reslen){ case TT_ERR: return NULL; } + *reslen=source-origsource; return node; } @@ -306,10 +315,12 @@ static AST* parseexpr(const char *source,int *reslen,int minprec){ Token tok=nexttoken(&source,true); printtoken(stderr,tok,"parseEXPR"); if(tok.type==TT_ENDSTMT){ + fprintf(stderr," (token undo)\n"); source=beforeop; break; } if(tok.type==TT_SYM&&tok.len==1&&tok.str[0]==')'){ + fprintf(stderr," (token undo)\n"); source=beforeop; break; } @@ -319,6 +330,7 @@ static AST* parseexpr(const char *source,int *reslen,int minprec){ } int prec=precedence_len(tok.str,tok.len); if(prec