diff options
| author | Mike Buland <mike@xagasoft.com> | 2013-04-23 13:15:06 -0600 |
|---|---|---|
| committer | Mike Buland <mike@xagasoft.com> | 2013-04-23 13:15:06 -0600 |
| commit | 4bd16214f0c6d2b4079b01d68b7e36ad408406d4 (patch) | |
| tree | 1bed3875ee881a276701824ed823dcce27ccd73c | |
| parent | 23affa8ed0b37ec0162177a716047260cc5b7cf1 (diff) | |
| download | clic-4bd16214f0c6d2b4079b01d68b7e36ad408406d4.tar.gz clic-4bd16214f0c6d2b4079b01d68b7e36ad408406d4.tar.bz2 clic-4bd16214f0c6d2b4079b01d68b7e36ad408406d4.tar.xz clic-4bd16214f0c6d2b4079b01d68b7e36ad408406d4.zip | |
Now supports modulus (strange for fractions).
| -rw-r--r-- | src/lexer.cpp | 5 | ||||
| -rw-r--r-- | src/parser.cpp | 14 | ||||
| -rw-r--r-- | src/token.cpp | 1 | ||||
| -rw-r--r-- | src/token.h | 1 |
4 files changed, 21 insertions, 0 deletions
diff --git a/src/lexer.cpp b/src/lexer.cpp index 46686c8..2521b40 100644 --- a/src/lexer.cpp +++ b/src/lexer.cpp | |||
| @@ -70,6 +70,7 @@ Token Lexer::nextToken() | |||
| 70 | sBuf[iBufPos] != ' ' && sBuf[iBufPos] != '\t' && | 70 | sBuf[iBufPos] != ' ' && sBuf[iBufPos] != '\t' && |
| 71 | sBuf[iBufPos] != '+' && sBuf[iBufPos] != '-' && | 71 | sBuf[iBufPos] != '+' && sBuf[iBufPos] != '-' && |
| 72 | sBuf[iBufPos] != '*' && sBuf[iBufPos] != '/' && | 72 | sBuf[iBufPos] != '*' && sBuf[iBufPos] != '/' && |
| 73 | sBuf[iBufPos] != '%' && | ||
| 73 | sBuf[iBufPos] != '(' && sBuf[iBufPos] != ')'; | 74 | sBuf[iBufPos] != '(' && sBuf[iBufPos] != ')'; |
| 74 | iBufPos++ ) | 75 | iBufPos++ ) |
| 75 | { | 76 | { |
| @@ -99,6 +100,10 @@ Token Lexer::nextToken() | |||
| 99 | iBufPos++; | 100 | iBufPos++; |
| 100 | return Token( Token::tDivide ); | 101 | return Token( Token::tDivide ); |
| 101 | 102 | ||
| 103 | case '%': | ||
| 104 | iBufPos++; | ||
| 105 | return Token( Token::tModulus ); | ||
| 106 | |||
| 102 | case '(': | 107 | case '(': |
| 103 | iBufPos++; | 108 | iBufPos++; |
| 104 | return Token( Token::tOpenParen ); | 109 | return Token( Token::tOpenParen ); |
diff --git a/src/parser.cpp b/src/parser.cpp index 5bb0aa6..df9e869 100644 --- a/src/parser.cpp +++ b/src/parser.cpp | |||
| @@ -239,6 +239,18 @@ void Parser::unwind() | |||
| 239 | ); | 239 | ); |
| 240 | } | 240 | } |
| 241 | break; | 241 | break; |
| 242 | |||
| 243 | case Token::tModulus: | ||
| 244 | { | ||
| 245 | Token b = tsTerminal.peekPop(); | ||
| 246 | Token a = tsTerminal.peekPop(); | ||
| 247 | tsTerminal.push( | ||
| 248 | Token( Token::tNumber, | ||
| 249 | new Number( deref(a) % deref(b) ) | ||
| 250 | ) | ||
| 251 | ); | ||
| 252 | } | ||
| 253 | break; | ||
| 242 | 254 | ||
| 243 | case Token::tOpenParen: | 255 | case Token::tOpenParen: |
| 244 | tsNonTerminal.push( t ); | 256 | tsNonTerminal.push( t ); |
| @@ -296,6 +308,7 @@ int Parser::reqTokens( Token::Type eType ) | |||
| 296 | case Token::tMinus: | 308 | case Token::tMinus: |
| 297 | case Token::tDivide: | 309 | case Token::tDivide: |
| 298 | case Token::tMultiply: | 310 | case Token::tMultiply: |
| 311 | case Token::tModulus: | ||
| 299 | case Token::tEquals: | 312 | case Token::tEquals: |
| 300 | return 2; | 313 | return 2; |
| 301 | 314 | ||
| @@ -326,6 +339,7 @@ int Parser::getPriority( Token::Type eType ) | |||
| 326 | 339 | ||
| 327 | case Token::tDivide: | 340 | case Token::tDivide: |
| 328 | case Token::tMultiply: | 341 | case Token::tMultiply: |
| 342 | case Token::tModulus: | ||
| 329 | return 2; | 343 | return 2; |
| 330 | 344 | ||
| 331 | case Token::tOpenParen: | 345 | case Token::tOpenParen: |
diff --git a/src/token.cpp b/src/token.cpp index 019e54d..5b0e6fe 100644 --- a/src/token.cpp +++ b/src/token.cpp | |||
| @@ -59,6 +59,7 @@ Bu::Formatter &operator<<( Bu::Formatter &f, Token::Type eType ) | |||
| 59 | case Token::tMinus: return f << "-"; | 59 | case Token::tMinus: return f << "-"; |
| 60 | case Token::tDivide: return f << "/"; | 60 | case Token::tDivide: return f << "/"; |
| 61 | case Token::tMultiply: return f << "*"; | 61 | case Token::tMultiply: return f << "*"; |
| 62 | case Token::tModulus: return f << "%"; | ||
| 62 | case Token::tOpenParen: return f << "("; | 63 | case Token::tOpenParen: return f << "("; |
| 63 | case Token::tCloseParen: return f << ")"; | 64 | case Token::tCloseParen: return f << ")"; |
| 64 | case Token::tEquals: return f << "="; | 65 | case Token::tEquals: return f << "="; |
diff --git a/src/token.h b/src/token.h index 05a610a..1cc6516 100644 --- a/src/token.h +++ b/src/token.h | |||
| @@ -20,6 +20,7 @@ public: | |||
| 20 | tMinus, | 20 | tMinus, |
| 21 | tDivide, | 21 | tDivide, |
| 22 | tMultiply, | 22 | tMultiply, |
| 23 | tModulus, | ||
| 23 | tOpenParen, | 24 | tOpenParen, |
| 24 | tCloseParen, | 25 | tCloseParen, |
| 25 | tEquals, | 26 | tEquals, |
