aboutsummaryrefslogtreecommitdiff
path: root/parser.cpp
diff options
context:
space:
mode:
authorTeddy <ted.sybil@gmail.com>2013-08-06 21:06:18 +0800
committerTeddy <ted.sybil@gmail.com>2013-08-06 21:06:18 +0800
commitdd6394d93dc21305e26232891daf5b19c226dd3a (patch)
tree93f6b5d0e85682b4f2b0d1f25e89cf77bafa45d5 /parser.cpp
parent3406f0a979e2465a993b20c2eb1033729c6a787c (diff)
dot sign support in literal mode
Diffstat (limited to 'parser.cpp')
-rw-r--r--parser.cpp24
1 files changed, 19 insertions, 5 deletions
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<SymObj*>(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;
}