ListPtr Parser::read_list() { CellPtr head = make_cell(); CellPtr current = head; m_word = m_scanner->get_word(); ExprPtr expr; if (m_word.type == ")") { return head; } else { expr = read_expr(); head->setcar(expr); m_word = m_scanner->get_word(); } while (m_word.type != ")") { if (m_word.type == ".") { m_word = m_scanner->get_word(); expr = read_expr(); current->setcdr(expr); m_word = m_scanner->get_word(); } else if (m_word.type == ")") { break; } else { expr = read_expr(); CellPtr new_cell = make_cell(); new_cell->setcar(expr); current->setcdr(new_cell); current = new_cell; m_word = m_scanner->get_word(); } } return head; }