diff options
author | Mike Buland <eichlan@xagasoft.com> | 2016-12-01 11:16:25 -0700 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2016-12-01 11:16:25 -0700 |
commit | 32b48aeb75db4ad40fe0173614e585f9bee72257 (patch) | |
tree | 36ec0bbb72ece290ba82906edf3ae6c50f2a0984 /src | |
parent | b96daa4e9849ac9caf5c0dfcea8daac28267ea19 (diff) | |
download | clic-32b48aeb75db4ad40fe0173614e585f9bee72257.tar.gz clic-32b48aeb75db4ad40fe0173614e585f9bee72257.tar.bz2 clic-32b48aeb75db4ad40fe0173614e585f9bee72257.tar.xz clic-32b48aeb75db4ad40fe0173614e585f9bee72257.zip |
Found a big problem with order of operations.
I believe this is because I'm using right tail recursion, but I'm not really
sure how I could change it for this program.
order of operations is being observed perfectly, but then operations are being
performed from right to left, not left to right. I think I may be reducing
too frequently, honestly.
Diffstat (limited to 'src')
-rw-r--r-- | src/parser.cpp | 38 | ||||
-rw-r--r-- | src/parser.h | 1 | ||||
-rw-r--r-- | src/scriptengine.cpp | 24 | ||||
-rw-r--r-- | src/token.h | 1 |
4 files changed, 46 insertions, 18 deletions
diff --git a/src/parser.cpp b/src/parser.cpp index c7cf994..701c4bd 100644 --- a/src/parser.cpp +++ b/src/parser.cpp | |||
@@ -20,8 +20,7 @@ Parser::~Parser() | |||
20 | Expression *Parser::parse() | 20 | Expression *Parser::parse() |
21 | { | 21 | { |
22 | pCurExp = new Expression(); | 22 | pCurExp = new Expression(); |
23 | exprR(); | 23 | statement(); |
24 | reduce(); | ||
25 | 24 | ||
26 | printState("Final"); | 25 | printState("Final"); |
27 | 26 | ||
@@ -40,7 +39,7 @@ void Parser::exprR() | |||
40 | 39 | ||
41 | void Parser::expr() | 40 | void Parser::expr() |
42 | { | 41 | { |
43 | //Bu::sio << "::expr " << lex[0] << Bu::sio.nl; | 42 | Bu::sio << "::expr " << lex[0] << Bu::sio.nl; |
44 | if( lex[0].eType == Token::tEndOfInput ) | 43 | if( lex[0].eType == Token::tEndOfInput ) |
45 | return; | 44 | return; |
46 | 45 | ||
@@ -57,7 +56,7 @@ void Parser::expr() | |||
57 | case Token::tModulus: | 56 | case Token::tModulus: |
58 | Token t = lex[0]; | 57 | Token t = lex[0]; |
59 | lex.nextToken(); | 58 | lex.nextToken(); |
60 | //Bu::sio << "->expr " << t << " " << lex[0] << Bu::sio.nl; | 59 | Bu::sio << "->expr " << t << " " << lex[0] << Bu::sio.nl; |
61 | if( lex[0].eType == Token::tOpenParen ) | 60 | if( lex[0].eType == Token::tOpenParen ) |
62 | { | 61 | { |
63 | exprP(); | 62 | exprP(); |
@@ -70,10 +69,10 @@ void Parser::expr() | |||
70 | if( lex[0].eType == Token::tNumber || | 69 | if( lex[0].eType == Token::tNumber || |
71 | lex[0].eType == Token::tVariable ) | 70 | lex[0].eType == Token::tVariable ) |
72 | { | 71 | { |
73 | //Bu::sio << "->expr " << t << | 72 | Bu::sio << "->expr " << t << |
74 | // " " << lex[0] << | 73 | " " << lex[0] << |
75 | // " " << lex[1] << | 74 | " " << lex[1] << |
76 | // Bu::sio.nl; | 75 | Bu::sio.nl; |
77 | shift( lex[0] ); | 76 | shift( lex[0] ); |
78 | if( lex[1].eType&Token::mMetaOperator ) | 77 | if( lex[1].eType&Token::mMetaOperator ) |
79 | { | 78 | { |
@@ -111,14 +110,14 @@ void Parser::expr() | |||
111 | else if( lex[0].eType == Token::tMinus ) | 110 | else if( lex[0].eType == Token::tMinus ) |
112 | { | 111 | { |
113 | // This is negation | 112 | // This is negation |
114 | //Bu::sio << "next token: " << lex[0] << Bu::sio.nl; | 113 | Bu::sio << "next token: " << lex[0] << Bu::sio.nl; |
115 | printState("inline-negate"); | 114 | printState("inline-negate"); |
116 | exprP(); | 115 | exprP(); |
117 | printState("inline-negate-post"); | 116 | printState("inline-negate-post"); |
118 | shift( t ); | 117 | shift( t ); |
119 | printState("inline-negate-post2"); | 118 | printState("inline-negate-post2"); |
120 | 119 | ||
121 | //Bu::sio << "??? " << lex[0] << Bu::sio.nl; | 120 | Bu::sio << "??? " << lex[0] << Bu::sio.nl; |
122 | } | 121 | } |
123 | } | 122 | } |
124 | break; | 123 | break; |
@@ -157,7 +156,7 @@ void Parser::exprP() | |||
157 | exprR(); | 156 | exprR(); |
158 | if( lex[0].eType != Token::tCloseParen ) | 157 | if( lex[0].eType != Token::tCloseParen ) |
159 | { | 158 | { |
160 | //Bu::sio << "::exprP " << lex[0] << Bu::sio.nl; | 159 | Bu::sio << "::exprP " << lex[0] << Bu::sio.nl; |
161 | throw Bu::ExceptionBase("Expected close paren"); | 160 | throw Bu::ExceptionBase("Expected close paren"); |
162 | } | 161 | } |
163 | shift( lex[0] ); | 162 | shift( lex[0] ); |
@@ -175,6 +174,21 @@ void Parser::exprP() | |||
175 | break; | 174 | break; |
176 | } | 175 | } |
177 | } | 176 | } |
177 | |||
178 | void Parser::statement() | ||
179 | { | ||
180 | if( lex[0].eType == Token::tCommand ) | ||
181 | { | ||
182 | lex.setMode( Lexer::modeCommand ); | ||
183 | lex.setMode( Lexer::modeNormal ); | ||
184 | } | ||
185 | else | ||
186 | { | ||
187 | exprR(); | ||
188 | reduce(); | ||
189 | } | ||
190 | } | ||
191 | |||
178 | /* | 192 | /* |
179 | case Token::tCommand: | 193 | case Token::tCommand: |
180 | lex.setMode( Lexer::modeCommand ); | 194 | lex.setMode( Lexer::modeCommand ); |
@@ -403,7 +417,6 @@ int Parser::getPriority( Token::Type eType ) | |||
403 | 417 | ||
404 | void Parser::printState( const Bu::String &sTag ) | 418 | void Parser::printState( const Bu::String &sTag ) |
405 | { | 419 | { |
406 | /* | ||
407 | Bu::sio << "----------------" << Bu::sio.nl; | 420 | Bu::sio << "----------------" << Bu::sio.nl; |
408 | Bu::sio << sTag << " stack:"; | 421 | Bu::sio << sTag << " stack:"; |
409 | for( TokenStack::iterator i = tsParse.begin(); i; i++ ) | 422 | for( TokenStack::iterator i = tsParse.begin(); i; i++ ) |
@@ -418,6 +431,5 @@ void Parser::printState( const Bu::String &sTag ) | |||
418 | } | 431 | } |
419 | Bu::sio << Bu::sio.nl; | 432 | Bu::sio << Bu::sio.nl; |
420 | Bu::sio << "----------------" << Bu::sio.nl; | 433 | Bu::sio << "----------------" << Bu::sio.nl; |
421 | */ | ||
422 | } | 434 | } |
423 | 435 | ||
diff --git a/src/parser.h b/src/parser.h index 1e0d1c4..60dd8e1 100644 --- a/src/parser.h +++ b/src/parser.h | |||
@@ -55,6 +55,7 @@ private: | |||
55 | void expr(); | 55 | void expr(); |
56 | void exprP(); | 56 | void exprP(); |
57 | void exprR(); | 57 | void exprR(); |
58 | void statement(); | ||
58 | 59 | ||
59 | private: | 60 | private: |
60 | void shift( const Token &t ); | 61 | void shift( const Token &t ); |
diff --git a/src/scriptengine.cpp b/src/scriptengine.cpp index 7b5df03..b828409 100644 --- a/src/scriptengine.cpp +++ b/src/scriptengine.cpp | |||
@@ -56,19 +56,35 @@ Number ScriptEngine::exec( Expression *pExpr ) | |||
56 | break; | 56 | break; |
57 | 57 | ||
58 | case Token::tPlus: | 58 | case Token::tPlus: |
59 | sNums.push( sNums.peekPop() + sNums.peekPop() ); | 59 | { |
60 | Number a = sNums.peekPop(); | ||
61 | Number b = sNums.peekPop(); | ||
62 | sNums.push( a + b ); | ||
63 | } | ||
60 | break; | 64 | break; |
61 | 65 | ||
62 | case Token::tMinus: | 66 | case Token::tMinus: |
63 | sNums.push( sNums.peekPop() - sNums.peekPop() ); | 67 | { |
68 | Number a = sNums.peekPop(); | ||
69 | Number b = sNums.peekPop(); | ||
70 | sNums.push( a - b ); | ||
71 | } | ||
64 | break; | 72 | break; |
65 | 73 | ||
66 | case Token::tDivide: | 74 | case Token::tDivide: |
67 | sNums.push( sNums.peekPop() / sNums.peekPop() ); | 75 | { |
76 | Number a = sNums.peekPop(); | ||
77 | Number b = sNums.peekPop(); | ||
78 | sNums.push( a / b ); | ||
79 | } | ||
68 | break; | 80 | break; |
69 | 81 | ||
70 | case Token::tMultiply: | 82 | case Token::tMultiply: |
71 | sNums.push( sNums.peekPop() * sNums.peekPop() ); | 83 | { |
84 | Number a = sNums.peekPop(); | ||
85 | Number b = sNums.peekPop(); | ||
86 | sNums.push( a * b ); | ||
87 | } | ||
72 | break; | 88 | break; |
73 | 89 | ||
74 | case Token::tNegate: | 90 | case Token::tNegate: |
diff --git a/src/token.h b/src/token.h index 4ad1136..5bede41 100644 --- a/src/token.h +++ b/src/token.h | |||
@@ -40,7 +40,6 @@ public: | |||
40 | mMetaOperator = 0x4000, | 40 | mMetaOperator = 0x4000, |
41 | mMetaAltOp = 0x8000, | 41 | mMetaAltOp = 0x8000, |
42 | mMetaMeta = 0x0100, | 42 | mMetaMeta = 0x0100, |
43 | |||
44 | }; | 43 | }; |
45 | 44 | ||
46 | Token(); | 45 | Token(); |