00001
00002
00003
00004
00005
00006
00007
00008 #include <cstring>
00009
00010 #include "../impulse.h"
00011 #include "token.h"
00012
00013 namespace impulse { namespace parser {
00014
00015
00016
00017
00018
00019 class Lexer : public Frame {
00020
00021 public:
00022
00023 Lexer( Stream& stream );
00024
00025 Token nextToken();
00026 Token peekToken();
00027 Token token() { return _token; }
00028
00029 void reset();
00030
00031 Token readNumber();
00032 Token readOperator();
00033 Token readIdentifier();
00034 Token readString();
00035 Token readSubexpr();
00036 Token readAssign();
00037 Token readTerminator();
00038
00039 private:
00040
00041 Stream& _stream;
00042
00043 char _buffer[256];
00044 vector<Token (Lexer::*)()> _readers;
00045 Token _peek;
00046 Token _token;
00047
00048 };
00049
00050
00051
00052
00053
00054 class Parser : public Frame {
00055
00056 public:
00057
00058 Parser( Lexer& lexer ) : _lexer( lexer ) { }
00059
00060 Lexer& lexer() { return _lexer; }
00061
00062 void parse( Express& expr );
00063
00064 virtual void peek( Express& expr, Token token ) { }
00065 virtual void nil( Express& expr, Token token ) { }
00066 virtual void number( Express& expr, Token token ) { }
00067 virtual void stringx( Express& expr, Token token ) { }
00068 virtual void operatorx( Express& expr, Token token ) { }
00069 virtual void identifier( Express& expr, Token token ) { }
00070 virtual void openexpr( Express& expr, Token token ) { }
00071 virtual void closeexpr( Express& expr, Token token ) { }
00072 virtual void assign( Express& expr, Token token ) { }
00073 virtual void terminator( Express& expr, Token token ) { }
00074
00075 virtual void initialize( Express&, Token token ) { }
00076 virtual void finalize( Express& expr, Token token ) { }
00077
00078 private:
00079
00080 Lexer& _lexer;
00081
00082 };
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093 Lexer::Lexer( Stream& stream ) : _stream( stream ), _peek( Token( &Parser::peek, _nil_ ) ), _token( Token( &Parser::nil, _nil_ ) )
00094 {
00095 _readers.push_back( &Lexer::readNumber );
00096 _readers.push_back( &Lexer::readString );
00097 _readers.push_back( &Lexer::readOperator );
00098 _readers.push_back( &Lexer::readIdentifier );
00099 _readers.push_back( &Lexer::readSubexpr );
00100 _readers.push_back( &Lexer::readAssign );
00101 _readers.push_back( &Lexer::readTerminator );
00102 }
00103
00104 Token Lexer::nextToken()
00105 {
00106 if (_peek.type() != &Parser::peek )
00107 {
00108 Token token = _peek;
00109
00110 _peek = Token( &Parser::peek, _nil_ );
00111
00112 return token;
00113 }
00114
00115 while( _stream.peek() == ' ' || _stream.peek() == '\t' ) _stream.getc();
00116
00117 memset( _buffer, 0, 256 );
00118
00119 for (unsigned int i = 0; i < _readers.size(); i++)
00120 {
00121 _token = (this->*_readers[i])();
00122
00123 if (_token.type() != &Parser::nil) return _token;
00124 }
00125
00126 _buffer[0] = _stream.getc();
00127
00128
00129 _token = Token( &Parser::nil, &Symbol::at( _buffer ) );
00130
00131 return _token;
00132 }
00133
00134 void Lexer::reset()
00135 {
00136 _peek = Token( &Parser::peek, _nil_ );
00137 _token = Token( &Parser::nil, _nil_ );
00138 }
00139
00140 Token Lexer::peekToken()
00141 {
00142 if (_peek.type() != &Parser::peek) return _peek;
00143
00144 _peek = nextToken();
00145
00146 return _peek;
00147 }
00148
00149
00150 Token Lexer::readNumber()
00151 {
00152 if (!isdigit( _stream.peek() )) return Token( &Parser::nil, _nil_ );
00153
00154 long i = 0;
00155
00156 while (isdigit( _stream.peek() ))
00157 {
00158 _buffer[i++] = _stream.getc();
00159 }
00160
00161 return Token( &Parser::number, atof( _buffer ) );
00162 }
00163
00164 Token Lexer::readString()
00165 {
00166 if (_stream.peek() != '"') return Token( &Parser::nil, _nil_ );
00167
00168 _stream.getc();
00169
00170 long i = 0;
00171
00172 while (_stream.peek() != '"')
00173 {
00174 _buffer[i++] = _stream.getc();
00175 }
00176
00177 _stream.getc();
00178
00179 return Token( &Parser::stringx, new String( _buffer ) );
00180 }
00181
00182 Token Lexer::readOperator()
00183 {
00184 int c = _stream.peek();
00185
00186 if ( c != '+' && c != '-' && c != '*' && c != '/' ) return Token( &Parser::nil, _nil_ );
00187
00188 _buffer[0] = _stream.getc();
00189
00190 return Token( &Parser::operatorx, &Symbol::at(_buffer) );
00191 }
00192
00193 Token Lexer::readIdentifier()
00194 {
00195 if (!isalpha( _stream.peek() )) return Token( &Parser::nil, _nil_ );
00196
00197 long i = 0;
00198
00199 while (isalpha( _stream.peek() ))
00200 {
00201 _buffer[i++] = _stream.getc();
00202 }
00203
00204 return Token( &Parser::identifier, &Symbol::at(_buffer) );
00205 }
00206
00207 Token Lexer::readSubexpr()
00208 {
00209 long c = _stream.peek();
00210
00211 if (c != '(' && c != ')') return Token( &Parser::nil, _nil_ );
00212
00213 _buffer[0] = _stream.getc();
00214
00215 if (c == '(')
00216
00217 return Token( &Parser::openexpr, &Symbol::at( _buffer ) );
00218 else
00219
00220 return Token( &Parser::closeexpr, &Symbol::at( _buffer ) );
00221 }
00222
00223 Token Lexer::readAssign()
00224 {
00225 if ( _stream.peek() != '=' ) return Token( &Parser::nil, _nil_ );
00226
00227 _buffer[0] = _stream.getc();
00228
00229
00230 return Token( &Parser::assign, &Symbol::at( _buffer ) );
00231 }
00232
00233 Token Lexer::readTerminator()
00234 {
00235 if ( _stream.peek() != 10 ) return Token( &Parser::nil, _nil_ );
00236
00237 _stream.getc();
00238
00239 return Token( &Parser::terminator, &Symbol::at( "[newline]") );
00240 }
00241
00242 } }
00243