From dd6394d93dc21305e26232891daf5b19c226dd3a Mon Sep 17 00:00:00 2001 From: Teddy Date: Tue, 6 Aug 2013 21:06:18 +0800 Subject: dot sign support in literal mode --- parser.cpp | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) (limited to 'parser.cpp') diff --git a/parser.cpp b/parser.cpp index 05806f1..56b3dd9 100644 --- a/parser.cpp +++ b/parser.cpp @@ -168,20 +168,34 @@ Cons *ASTGenerator::absorb(Tokenizor *tk) { { if (top_ptr == parse_stack) throw NormalError(READ_ERR_UNEXPECTED_RIGHT_BRACKET); - Cons *lst = empty_list; + EvalObj *lst = empty_list; + bool improper = false; while (top_ptr >= parse_stack && !IS_BRAKET(*(--top_ptr))) { - Cons *_lst = new Cons(TO_EVAL(*top_ptr), lst); // Collect the list - _lst->next = lst == empty_list ? NULL : lst; - lst = _lst; + EvalObj *obj = TO_EVAL(*top_ptr); + if (obj->is_sym_obj() && static_cast(obj)->val == ".") + { + improper = true; + if (lst == empty_list || TO_CONS(lst)->cdr != empty_list) + throw NormalError(PAR_ERR_IMPROPER_PAIR); + lst = TO_CONS(lst)->car; + } + else + { + Cons *_lst = new Cons(obj, lst); // Collect the list + _lst->next = lst->is_cons_obj() ? TO_CONS(lst) : NULL; + lst = _lst; + } } + ParseBracket *bptr = TO_BRACKET(*top_ptr); if (bptr->btype == 0) *top_ptr++ = lst; else if (bptr->btype == 1) { + if (improper) throw NormalError(PAR_ERR_IMPROPER_VECT); VecObj *vec = new VecObj(); - for (Cons *ptr = lst; ptr != empty_list; ptr = TO_CONS(ptr->cdr)) + for (Cons *ptr = TO_CONS(lst); ptr != empty_list; ptr = TO_CONS(ptr->cdr)) vec->push_back(ptr->car); *top_ptr++ = vec; } -- cgit v1.2.3