00001
00002
00003
00004
00005
00006
00007
00008 #include "../impulse.h"
00009 #include "lexer.h"
00010
00011 #include <cstring>
00012
00013 namespace impulse { namespace parser {
00014
00015
00016
00017
00018
00019 void Parser::parse( Express& code )
00020 {
00021 Token peek = _lexer.peekToken();
00022
00023 this->initialize( code, lexer().token() );
00024
00025 (this->*peek.type())( code, peek );
00026
00027 this->finalize( code, lexer().token() );
00028 }
00029
00030
00031
00032
00033
00034 class ExpressionParser : public Parser {
00035
00036 public:
00037
00038 ExpressionParser( Lexer& lexer ) : Parser( lexer ) { }
00039
00040 void initialize( Express& expr, Token token );
00041 void finalize( Express& expr, Token token );
00042
00043 void number( Express& expr, Token token );
00044 void stringx( Express& expr, Token token );
00045 void identifier( Express& expr, Token token );
00046 void openexpr( Express& expr, Token token );
00047
00048 };
00049
00050
00051 class SubexprExpressionParser : public ExpressionParser {
00052
00053 public:
00054
00055 void initialize( Express& expr, Token token );
00056 void finalize( Express& expr, Token token );
00057
00058 SubexprExpressionParser( Lexer& lexer ) : ExpressionParser( lexer ) { }
00059
00060 };
00061
00062
00063 class MessageParser : public Parser {
00064
00065 public:
00066
00067 MessageParser( Lexer& lexer ) : Parser( lexer ) { }
00068
00069 void identifier( Express& expr, Token token );
00070 void operatorx( Express& expr, Token token );
00071
00072 };
00073
00074 class BinaryExpressionParser : public ExpressionParser {
00075
00076 public:
00077
00078 BinaryExpressionParser( Lexer& lexer ) : ExpressionParser( lexer ) { }
00079
00080 void initialize( Express& expr, Token token );
00081 void finalize( Express& expr, Token token );
00082
00083 void number( Express& expr, Token token );
00084
00085 };
00086
00087
00088 class BinaryMessageParser : public MessageParser {
00089
00090 public:
00091
00092 BinaryMessageParser( Lexer& lexer ) : MessageParser( lexer ) { }
00093
00094 void identifier( Express& expr, Token token );
00095 void operatorx( Express& expr, Token token );
00096
00097 };
00098
00099
00100
00101
00102
00103
00104 void ExpressionParser::initialize( Express& expr, Token peek )
00105 {
00106 BEG( "Expression::initialize()" );
00107 }
00108
00109 void ExpressionParser::finalize( Express& expr, Token peek )
00110 {
00111 END( "Expression::finalize()" );
00112
00113 if (peek.type() != &Parser::terminator)
00114 {
00115 Token token = lexer().nextToken();
00116
00117 cout << "*** Unexpected token: " << token.value().inspect() << endl;
00118 }
00119 }
00120
00121
00122 void ExpressionParser::number( Express& expr, Token peek )
00123 {
00124 BEG( "Expression::number( " << peek.value().inspect() << " )" );
00125
00126 Token token = lexer().nextToken();
00127
00128 expr.push( token.value() );
00129
00130 MessageParser( lexer() ).parse( expr );
00131
00132 END( "" );
00133 }
00134
00135 void ExpressionParser::stringx( Express& expr, Token peek )
00136 {
00137 BEG( "Expression::string( " << peek.value().inspect() << " )" );
00138
00139 Token token = lexer().nextToken();
00140
00141 expr.push( token.value() );
00142
00143 MessageParser( lexer() ).parse( expr );
00144
00145 END( "" );
00146 }
00147
00148 void ExpressionParser::identifier( Express& expr, Token peek )
00149 {
00150 BEG( "Expression::identifier( " << peek.value().inspect() << " )" );
00151
00152 Token token = lexer().nextToken();
00153
00154 if (lexer().peekToken().type() == &Parser::assign)
00155 {
00156 BEG( "Expression::assign()" );
00157
00158 lexer().nextToken();
00159
00160 Express* arg2 = new Express( expr );
00161 expr.push( new Assign( *token.value().get<Symbol>(), *arg2 ) );
00162
00163 ExpressionParser( lexer() ).parse( *arg2 );
00164
00165 END( "" );
00166 }
00167 else
00168 {
00169 expr.push( new Message( *token.value().get<Symbol>() ) );
00170
00171 MessageParser( lexer() ).parse( expr );
00172 }
00173
00174 END( "" );
00175 }
00176
00177 void ExpressionParser::openexpr( Express& expr, Token peek )
00178 {
00179 BEG( "Expression::openexpr()" );
00180
00181 lexer().nextToken();
00182
00183 Express* subexpr = new Express( expr );
00184 expr.push( subexpr );
00185
00186 SubexprExpressionParser( lexer() ).parse( *subexpr );
00187
00188 if (lexer().token().type() != &Parser::closeexpr)
00189 {
00190 cout << "Missing closing paren" << endl;
00191 }
00192
00193 lexer().nextToken();
00194
00195 MessageParser( lexer() ).parse( expr );
00196
00197 END( "Expression::openexpr()" );
00198 }
00199
00200
00201
00202 void SubexprExpressionParser::initialize( Express& expr, Token peek )
00203 {
00204 BEG( "SubExpression::initialize()" );
00205 }
00206
00207 void SubexprExpressionParser::finalize( Express& expr, Token peek )
00208 {
00209 END( "SubExpression::finalize()" );
00210 }
00211
00212
00213
00214
00215
00216 void MessageParser::identifier( Express& expr, Token peek )
00217 {
00218 BEG( "Message::identifier( " << peek.value().inspect() << " )" );
00219
00220 Token token = lexer().nextToken();
00221
00222 expr.push( new Message( *token.value().get<Symbol>() ) );
00223
00224 MessageParser( lexer() ).parse( expr );
00225
00226 END( "" );
00227 }
00228
00229 void MessageParser::operatorx( Express& expr, Token peek )
00230 {
00231 BEG( "Message::operator( " << peek.value().inspect() << " )" );
00232
00233 Token token = lexer().nextToken();
00234
00235 Express* arg1 = new Express( expr );
00236
00237 expr.push( new Message( *token.value().get<Symbol>(), arg1 ) );
00238
00239 BinaryExpressionParser( lexer() ).parse( *arg1 );
00240
00241 END( "" );
00242 }
00243
00244
00245
00246
00247
00248 void BinaryExpressionParser::number( Express& expr, Token peek )
00249 {
00250 BEG( "BinaryExpression::number( " << peek.value().inspect() << " )" );
00251
00252 Token token = lexer().nextToken();
00253
00254 expr.push( token.value() );
00255
00256 BinaryMessageParser( lexer() ).parse( expr );
00257
00258 END( "" );
00259 }
00260
00261 void BinaryExpressionParser::initialize( Express& expr, Token peek )
00262 {
00263 BEG( "BinaryExpression::initialize()" );
00264 }
00265
00266 void BinaryExpressionParser::finalize( Express& expr, Token peek )
00267 {
00268 END( "BinaryExpression::finalize()" );
00269 }
00270
00271
00272
00273
00274
00275 void BinaryMessageParser::identifier( Express& expr, Token peek )
00276 {
00277 BEG( "Message::identifier( " << peek.value().inspect() << " )" );
00278
00279 Token token = lexer().nextToken();
00280
00281 expr.push( new Message( *token.value().get<Symbol>() ) );
00282
00283 BinaryMessageParser( lexer() ).parse( expr );
00284
00285 END( "" );
00286 }
00287
00288 void BinaryMessageParser::operatorx( Express& expr, Token peek )
00289 {
00290 BEG( "BinaryMessage::operator( " << peek.value().inspect() << " )" );
00291
00292 Token token = lexer().nextToken();
00293
00294 Express* arg1 = new Express( expr.parent() );
00295
00296 expr.parent().push( new Message( *token.value().get<Symbol>(), arg1 ) );
00297
00298 BinaryExpressionParser( lexer() ).parse( *arg1 );
00299
00300 END( "" );
00301 }
00302
00303 } }
00304