summaryrefslogtreecommitdiff
path: root/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'parser.c')
-rw-r--r--parser.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/parser.c b/parser.c
index d91af7e..bab19a7 100644
--- a/parser.c
+++ b/parser.c
@@ -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: