diff options
Diffstat (limited to 'parser.c')
-rw-r--r-- | parser.c | 23 |
1 files changed, 12 insertions, 11 deletions
@@ -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: |