From cac651cd88f8da1e5957b0cc13fa25d79e1887fc Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Tue, 23 Aug 2016 20:58:50 +0200 Subject: Many things - two-letter AST union members - AST_QUOTED - AST_LAMBDA - an interpreter that works - function registering in the interpreter - some builtins --- parser.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'parser.c') diff --git a/parser.c b/parser.c index 910f3da..d9f4543 100644 --- a/parser.c +++ b/parser.c @@ -28,7 +28,7 @@ typedef struct Token{ int len; } Token; -#define SYMBOLCHARS "()[]" +#define SYMBOLCHARS "'()[]" static Token tt_make(Tokentype type,const char *str,int len){ @@ -92,8 +92,7 @@ static Token nexttoken(Cursor *cursor){ while(cursor->l>=1&&isspace(*cursor->s))advance(cursor,1); if(cursor->l==0)return tt_eof(); - if(strchr(SYMBOLCHARS,*cursor->s)!=NULL|| - (cursor->l>=2&&cursor->s[0]=='\''&&strchr(SYMBOLCHARS,cursor->s[1]))){ + if(strchr(SYMBOLCHARS,*cursor->s)!=NULL){ advance(cursor,1); return tt_make(TT_SYMBOL,cursor->s-1,1); } @@ -174,13 +173,17 @@ static ParseRet parse_(Cursor *cursor){ case TT_SYMBOL:{ char closing; if(tok.len!=1)assert(false); - bool quoted=false; if(tok.str[0]=='\''){ - quoted=true; - tok=nexttoken(cursor); - if(tok.type!=TT_SYMBOL||tok.len!=1||(tok.str[0]!='('&&tok.str[0]!='[')){ - return pr_err_c("Single quote symbol not before paren"); + ParseRet pr=parse_(cursor); + if(pr.errstr)return pr; + if(pr.ast->type==AST_WORD){ + char *word=pr.ast->wo.word; + pr.ast->type=AST_SYMBOL; + pr.ast->sy.name=word; + pr.ast->sy.symid=-1; + return pr; } + return pr_ast(ast_quoted(pr.ast)); } if(tok.str[0]=='(')closing=')'; @@ -216,9 +219,7 @@ static ParseRet parse_(Cursor *cursor){ } nodes[len++]=pr.ast; } - AST *l=ast_list(len,nodes); - l->l.quoted=quoted; - return pr_ast(l); + return pr_ast(ast_list(len,nodes)); } case TT_WORD: -- cgit v1.2.3-54-g00ecf