diff options
| -rw-r--r-- | src/lexer.cpp | 13 | ||||
| -rw-r--r-- | src/parser.cpp | 34 | ||||
| -rw-r--r-- | src/parser.h | 2 | ||||
| -rw-r--r-- | src/token.cpp | 26 | ||||
| -rw-r--r-- | src/token.h | 2 |
5 files changed, 69 insertions, 8 deletions
diff --git a/src/lexer.cpp b/src/lexer.cpp index fbcaafb..55d155d 100644 --- a/src/lexer.cpp +++ b/src/lexer.cpp | |||
| @@ -26,15 +26,15 @@ Lexer::~Lexer() | |||
| 26 | 26 | ||
| 27 | void Lexer::nextToken() | 27 | void Lexer::nextToken() |
| 28 | { | 28 | { |
| 29 | if( iLookAheadSize <= 1 ) | 29 | if( iLookAheadUsed <= 1 ) |
| 30 | { | 30 | { |
| 31 | iLookAheadSize = 0; | 31 | iLookAheadUsed = 0; |
| 32 | iLookAheadStart = 0; | 32 | iLookAheadStart = 0; |
| 33 | } | 33 | } |
| 34 | else | 34 | else |
| 35 | { | 35 | { |
| 36 | iLookAheadStart = (iLookAheadStart+1)%iLookAheadSize; | 36 | iLookAheadStart = (iLookAheadStart+1)%iLookAheadSize; |
| 37 | iLookAheadSize--; | 37 | iLookAheadUsed--; |
| 38 | } | 38 | } |
| 39 | } | 39 | } |
| 40 | 40 | ||
| @@ -55,11 +55,16 @@ void Lexer::fillToken() | |||
| 55 | default: | 55 | default: |
| 56 | throw Bu::ExceptionBase("Invalid mode."); | 56 | throw Bu::ExceptionBase("Invalid mode."); |
| 57 | } | 57 | } |
| 58 | 58 | /* | |
| 59 | Bu::sio << "read[" | 59 | Bu::sio << "read[" |
| 60 | << ((iLookAheadUsed+iLookAheadStart)%iLookAheadSize) | 60 | << ((iLookAheadUsed+iLookAheadStart)%iLookAheadSize) |
| 61 | << "]: " | 61 | << "]: " |
| 62 | << aLookAhead[(iLookAheadUsed+iLookAheadStart)%iLookAheadSize].eType; | 62 | << aLookAhead[(iLookAheadUsed+iLookAheadStart)%iLookAheadSize].eType; |
| 63 | if( aLookAhead[(iLookAheadUsed+iLookAheadStart)%iLookAheadSize].eType == Token::tNumber ) | ||
| 64 | Bu::sio << "(" | ||
| 65 | << aLookAhead[(iLookAheadUsed+iLookAheadStart)%iLookAheadSize].nVal->toString() << ")"; | ||
| 66 | Bu::sio << Bu::sio.nl; | ||
| 67 | */ | ||
| 63 | } | 68 | } |
| 64 | 69 | ||
| 65 | Token Lexer::nextTokenNormal() | 70 | Token Lexer::nextTokenNormal() |
diff --git a/src/parser.cpp b/src/parser.cpp index 1f9a193..0131ba3 100644 --- a/src/parser.cpp +++ b/src/parser.cpp | |||
| @@ -23,25 +23,53 @@ void Parser::parse() | |||
| 23 | for(;;) | 23 | for(;;) |
| 24 | { | 24 | { |
| 25 | lex.nextToken(); | 25 | lex.nextToken(); |
| 26 | if( lex[0].eType == Token::tEndOfInput ) | ||
| 27 | break; | ||
| 28 | |||
| 26 | expr(); | 29 | expr(); |
| 27 | 30 | ||
| 31 | Bu::sio << "Final stack:"; | ||
| 28 | for( TokenStack::iterator i = tsStack.begin(); i; i++ ) | 32 | for( TokenStack::iterator i = tsStack.begin(); i; i++ ) |
| 29 | { | 33 | { |
| 30 | Bu::sio << *i << " "; | 34 | Bu::sio << " " << (*i).eType; |
| 35 | if( (*i).eType == Token::tNumber ) | ||
| 36 | { | ||
| 37 | Bu::sio << "(" << (*i).nVal->toString() << ")"; | ||
| 38 | } | ||
| 31 | } | 39 | } |
| 40 | Bu::sio << Bu::sio.nl; | ||
| 32 | } | 41 | } |
| 33 | } | 42 | } |
| 34 | 43 | ||
| 35 | void Parser::expr() | 44 | void Parser::expr() |
| 36 | { | 45 | { |
| 46 | if( lex[0].eType == Token::tEndOfInput ) | ||
| 47 | return; | ||
| 37 | if( lex[0].eType == Token::tVariable && | 48 | if( lex[0].eType == Token::tVariable && |
| 38 | lex[1].eType == Token::tEquals ) | 49 | lex[1].eType == Token::tEquals ) |
| 39 | { | 50 | { |
| 40 | // Assignment! | 51 | Token t = lex[0]; |
| 52 | lex.nextToken(); | ||
| 53 | lex.nextToken(); | ||
| 41 | expr(); | 54 | expr(); |
| 55 | |||
| 42 | return; | 56 | return; |
| 43 | } | 57 | } |
| 44 | exprP(); | 58 | exprP(); |
| 59 | |||
| 60 | switch( lex[0].eType ) | ||
| 61 | { | ||
| 62 | case Token::tPlus: | ||
| 63 | case Token::tMinus: | ||
| 64 | case Token::tMultiply: | ||
| 65 | case Token::tDivide: | ||
| 66 | case Token::tModulus: | ||
| 67 | Token t = lex[0]; | ||
| 68 | lex.nextToken(); | ||
| 69 | expr(); | ||
| 70 | tsStack.push( t ); | ||
| 71 | break; | ||
| 72 | } | ||
| 45 | } | 73 | } |
| 46 | 74 | ||
| 47 | void Parser::exprP() | 75 | void Parser::exprP() |
| @@ -222,7 +250,7 @@ void Parser::setVariable( const Bu::String &sName, const Number &rValue ) | |||
| 222 | hVars.insert( sName, rValue ); | 250 | hVars.insert( sName, rValue ); |
| 223 | } | 251 | } |
| 224 | 252 | ||
| 225 | void Parser::unwind() | 253 | void Parser::reduce() |
| 226 | { | 254 | { |
| 227 | /* | 255 | /* |
| 228 | for(;;) | 256 | for(;;) |
diff --git a/src/parser.h b/src/parser.h index d50951b..05fab0b 100644 --- a/src/parser.h +++ b/src/parser.h | |||
| @@ -57,7 +57,7 @@ private: | |||
| 57 | void exprP(); | 57 | void exprP(); |
| 58 | 58 | ||
| 59 | private: | 59 | private: |
| 60 | void unwind(); | 60 | void reduce(); |
| 61 | int reqTokens( Token::Type eType ); | 61 | int reqTokens( Token::Type eType ); |
| 62 | int getPriority( Token::Type eType ); | 62 | int getPriority( Token::Type eType ); |
| 63 | Number &deref( Token &t ); | 63 | Number &deref( Token &t ); |
diff --git a/src/token.cpp b/src/token.cpp index 30f3566..c591e6a 100644 --- a/src/token.cpp +++ b/src/token.cpp | |||
| @@ -55,6 +55,32 @@ Token::~Token() | |||
| 55 | } | 55 | } |
| 56 | } | 56 | } |
| 57 | 57 | ||
| 58 | Token &Token::operator=( const Token &rhs ) | ||
| 59 | { | ||
| 60 | switch( eType ) | ||
| 61 | { | ||
| 62 | case tNumber: | ||
| 63 | delete nVal; | ||
| 64 | break; | ||
| 65 | |||
| 66 | case tVariable: | ||
| 67 | case tCommand: | ||
| 68 | case tString: | ||
| 69 | delete sVal; | ||
| 70 | break; | ||
| 71 | |||
| 72 | default: | ||
| 73 | break; | ||
| 74 | } | ||
| 75 | eType = rhs.eType; | ||
| 76 | sVal = rhs.sVal; | ||
| 77 | |||
| 78 | Token &rMod = const_cast<Token &>(rhs); | ||
| 79 | rMod.sVal = 0; | ||
| 80 | |||
| 81 | return *this; | ||
| 82 | } | ||
| 83 | |||
| 58 | Bu::Formatter &operator<<( Bu::Formatter &f, Token::Type eType ) | 84 | Bu::Formatter &operator<<( Bu::Formatter &f, Token::Type eType ) |
| 59 | { | 85 | { |
| 60 | switch( eType ) | 86 | switch( eType ) |
diff --git a/src/token.h b/src/token.h index 12a4904..8d7dc20 100644 --- a/src/token.h +++ b/src/token.h | |||
| @@ -41,6 +41,8 @@ public: | |||
| 41 | Token( const Token &rSrc ); | 41 | Token( const Token &rSrc ); |
| 42 | ~Token(); | 42 | ~Token(); |
| 43 | 43 | ||
| 44 | Token &operator=( const Token &rhs ); | ||
| 45 | |||
| 44 | Type eType; | 46 | Type eType; |
| 45 | union | 47 | union |
| 46 | { | 48 | { |
