diff options
| author | Mike Buland <eichlan@xagasoft.com> | 2016-11-30 13:57:04 -0700 |
|---|---|---|
| committer | Mike Buland <eichlan@xagasoft.com> | 2016-11-30 13:57:04 -0700 |
| commit | 0321e6e39b8cf24718cf853c28f0f35443753264 (patch) | |
| tree | 878bdaa2296014244f2dbe90d61c5c869e8204b7 /src/lexer.cpp | |
| parent | f50e787110c8b3ecbc1b07262842dd5fdc8a5e42 (diff) | |
| download | clic-0321e6e39b8cf24718cf853c28f0f35443753264.tar.gz clic-0321e6e39b8cf24718cf853c28f0f35443753264.tar.bz2 clic-0321e6e39b8cf24718cf853c28f0f35443753264.tar.xz clic-0321e6e39b8cf24718cf853c28f0f35443753264.zip | |
Working on the parser, some issues.
Diffstat (limited to 'src/lexer.cpp')
| -rw-r--r-- | src/lexer.cpp | 42 |
1 files changed, 38 insertions, 4 deletions
diff --git a/src/lexer.cpp b/src/lexer.cpp index b0d0fd1..fbcaafb 100644 --- a/src/lexer.cpp +++ b/src/lexer.cpp | |||
| @@ -11,27 +11,55 @@ Lexer::Lexer( Bu::Stream &rIn ) : | |||
| 11 | iRadix( 10 ), | 11 | iRadix( 10 ), |
| 12 | numRangeTop('9'), | 12 | numRangeTop('9'), |
| 13 | ascRangeTop('a'-1), | 13 | ascRangeTop('a'-1), |
| 14 | eMode( modeNormal ) | 14 | eMode( modeNormal ), |
| 15 | iLookAheadSize( 2 ), | ||
| 16 | iLookAheadUsed( 0 ), | ||
| 17 | iLookAheadStart( 0 ), | ||
| 18 | aLookAhead( 0 ) | ||
| 15 | { | 19 | { |
| 20 | aLookAhead = new Token[iLookAheadSize]; | ||
| 16 | } | 21 | } |
| 17 | 22 | ||
| 18 | Lexer::~Lexer() | 23 | Lexer::~Lexer() |
| 19 | { | 24 | { |
| 20 | } | 25 | } |
| 21 | 26 | ||
| 22 | Token Lexer::nextToken() | 27 | void Lexer::nextToken() |
| 28 | { | ||
| 29 | if( iLookAheadSize <= 1 ) | ||
| 30 | { | ||
| 31 | iLookAheadSize = 0; | ||
| 32 | iLookAheadStart = 0; | ||
| 33 | } | ||
| 34 | else | ||
| 35 | { | ||
| 36 | iLookAheadStart = (iLookAheadStart+1)%iLookAheadSize; | ||
| 37 | iLookAheadSize--; | ||
| 38 | } | ||
| 39 | } | ||
| 40 | |||
| 41 | void Lexer::fillToken() | ||
| 23 | { | 42 | { |
| 24 | switch( eMode ) | 43 | switch( eMode ) |
| 25 | { | 44 | { |
| 26 | case modeNormal: | 45 | case modeNormal: |
| 27 | return nextTokenNormal(); | 46 | aLookAhead[(iLookAheadUsed+iLookAheadStart)%iLookAheadSize] = |
| 47 | nextTokenNormal(); | ||
| 48 | break; | ||
| 28 | 49 | ||
| 29 | case modeCommand: | 50 | case modeCommand: |
| 30 | return nextTokenCommand(); | 51 | aLookAhead[(iLookAheadUsed+iLookAheadStart)%iLookAheadSize] = |
| 52 | nextTokenCommand(); | ||
| 53 | break; | ||
| 31 | 54 | ||
| 32 | default: | 55 | default: |
| 33 | throw Bu::ExceptionBase("Invalid mode."); | 56 | throw Bu::ExceptionBase("Invalid mode."); |
| 34 | } | 57 | } |
| 58 | |||
| 59 | Bu::sio << "read[" | ||
| 60 | << ((iLookAheadUsed+iLookAheadStart)%iLookAheadSize) | ||
| 61 | << "]: " | ||
| 62 | << aLookAhead[(iLookAheadUsed+iLookAheadStart)%iLookAheadSize].eType; | ||
| 35 | } | 63 | } |
| 36 | 64 | ||
| 37 | Token Lexer::nextTokenNormal() | 65 | Token Lexer::nextTokenNormal() |
| @@ -235,5 +263,11 @@ void Lexer::setRadix( int i ) | |||
| 235 | 263 | ||
| 236 | Token &Lexer::operator[]( int iIdx ) | 264 | Token &Lexer::operator[]( int iIdx ) |
| 237 | { | 265 | { |
| 266 | while( iIdx >= iLookAheadUsed ) | ||
| 267 | { | ||
| 268 | fillToken(); | ||
| 269 | iLookAheadUsed++; | ||
| 270 | } | ||
| 271 | return aLookAhead[(iLookAheadStart+iIdx)%iLookAheadSize]; | ||
| 238 | } | 272 | } |
| 239 | 273 | ||
