summaryrefslogtreecommitdiff
path: root/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'parser.c')
-rw-r--r--parser.c23
1 files changed, 12 insertions, 11 deletions
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: