diff options
Diffstat (limited to 'parser.c')
| -rw-r--r-- | parser.c | 16 | 
1 files changed, 14 insertions, 2 deletions
@@ -59,7 +59,8 @@ 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){ +	if(strchr(SYMBOLCHARS,*cursor->s)!=NULL|| +	   (cursor->l>=2&&cursor->s[0]=='\''&&strchr(SYMBOLCHARS,cursor->s[1]))){  		advance(cursor,1);  		return tt_make(TT_SYMBOL,cursor->s-1,1);  	} @@ -140,6 +141,15 @@ 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"); +				} +			} +  			if(tok.str[0]=='(')closing=')';  			else if(tok.str[0]=='[')closing=']';  			else if(tok.str[0]==')'||tok.str[0]==']'){ @@ -173,7 +183,9 @@ static ParseRet parse_(Cursor *cursor){  				}  				nodes[len++]=pr.ast;  			} -			return pr_ast(ast_list(len,nodes)); +			AST *l=ast_list(len,nodes); +			l->l.quoted=quoted; +			return pr_ast(l);  		}  		case TT_WORD:  | 
