8 using namespace utakata;
11 parser::DatumException::DatumException(std::string str) : str_()
15 ss << "datum error ! -- message : [" << str << "]" << std::endl;
19 const char* parser::DatumException::what() const throw()
24 ////////////////////////////
25 // Parser Implementations //
26 ////////////////////////////
28 parser::Parser::Parser(const smart_ptr<lexer::Lexer>& l) : lexer_(l)
32 bool parser::Parser::parse(smart_ptr<utf8::UTF8InputStream>& strm)
34 PARSERSTATUS status = PS_INIT;
35 smart_ptr<lexeme::ILexeme> lexm;
36 // lexemeがNullである状態になるまで進む。
39 while (!(lexm = lexer_->lex(strm)).isNull()) {
45 // lexemeが返ってきたら、構文定義に該当するかどうかを調べる。
46 // schemeの構文定義はシンプルかつ例外のないものになっているため、
48 if (status == PS_INIT)
50 if (lexm->getID() == lexeme::LexemeID::openParenthesis)
53 status = PS_LIST_BEGIN;
56 else if (lexm->getID() == lexeme::LexemeID::string ||
57 lexm->getID() == lexeme::LexemeID::number ||
58 lexm->getID() == lexeme::LexemeID::identifier ||
59 lexm->getID() == lexeme::LexemeID::charactor ||
60 lexm->getID() == lexeme::LexemeID::boolean)
62 // それぞれの場合、lexeme_datumとして扱われる。
63 status = PS_LEXEME_DATUM;
65 else if (lexm->getID() == lexeme::LexemeID::byteVector)
68 status = PS_BYTEVECTOR_START;
70 else if (lexm->getID() == lexeme::LexemeID::vector)
73 status = PS_VECTOR_START;
75 else if (isAbbrev(lexm))
77 // abbreviationを判別してstatusを返す。
78 status = guessAbbrev(lexm);
82 throw DatumException("datumの開始記号ではありません");
85 else if (status == PS_LIST_BEGIN)
87 // リストの開始記号である場合、PS_LIST_END以外は原則として
89 if (lexm->getID() == lexeme::LexemeID::closeParenthesis)
99 bool parser::Parser::isAbbrev(const smart_ptr<lexeme::ILexeme>& l)
101 switch (l->getID().toEnum())
103 case lexeme::LexemeID::BACKQUOTE: return true;
104 case lexeme::LexemeID::QUOTE: return true;
105 case lexeme::LexemeID::UNQUOTE: return true;
106 case lexeme::LexemeID::UNQUOTESPLICING: return true;
107 case lexeme::LexemeID::SYNTAX: return true;
108 case lexeme::LexemeID::QUASISYNTAX: return true;
109 case lexeme::LexemeID::UNSYNTAX: return true;
110 case lexeme::LexemeID::UNSYNTAXSPLICING: return true;
116 parser::Parser::PARSERSTATUS parser::Parser::guessAbbrev(const smart_ptr<lexeme::ILexeme>& l)
118 switch (l->getID().toEnum())
120 case lexeme::LexemeID::BACKQUOTE: return PS_LIST_ABB_QQUOTE;
121 case lexeme::LexemeID::QUOTE: return PS_LIST_ABB_QUOTE;
122 case lexeme::LexemeID::UNQUOTE: return PS_LIST_ABB_UQUOTE;
123 case lexeme::LexemeID::UNQUOTESPLICING: return PS_LIST_ABB_UQUOTE_SP;
124 case lexeme::LexemeID::SYNTAX: return PS_LIST_ABB_SYNTAX;
125 case lexeme::LexemeID::QUASISYNTAX: return PS_LIST_ABB_QSYNTAX;
126 case lexeme::LexemeID::UNSYNTAX: return PS_LIST_ABB_USYNTAX;
127 case lexeme::LexemeID::UNSYNTAXSPLICING: return PS_LIST_ABB_USYNTAX_SP;