diff options
author | Mike Buland <eichlan@xagasoft.com> | 2009-01-23 22:28:56 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2009-01-23 22:28:56 +0000 |
commit | b53b359c8d5079c996e47abafdf76781c4b1afc0 (patch) | |
tree | 3fdda8c8475add7d0330aaf44889816e94886202 /src/formula.h | |
parent | 4ab0993d037c9ad84b3fcaf2ec8fb3d905fc7350 (diff) | |
download | libbu++-b53b359c8d5079c996e47abafdf76781c4b1afc0.tar.gz libbu++-b53b359c8d5079c996e47abafdf76781c4b1afc0.tar.bz2 libbu++-b53b359c8d5079c996e47abafdf76781c4b1afc0.tar.xz libbu++-b53b359c8d5079c996e47abafdf76781c4b1afc0.zip |
Ugh, more fixes...this time I've disallowed ending with an operator, there were
just too many cases where that was causing trouble. Now it seems like
everything is working correctly again.
Diffstat (limited to '')
-rw-r--r-- | src/formula.h | 123 |
1 files changed, 63 insertions, 60 deletions
diff --git a/src/formula.h b/src/formula.h index 1fe96f9..a0996ea 100644 --- a/src/formula.h +++ b/src/formula.h | |||
@@ -59,70 +59,73 @@ namespace Bu | |||
59 | 59 | ||
60 | prec run( const Bu::FString &sFormulaSrc ) | 60 | prec run( const Bu::FString &sFormulaSrc ) |
61 | { | 61 | { |
62 | /* | 62 | if( sFormulaSrc.isEmpty() ) |
63 | if( !sOper.isEmpty() ) | 63 | throw FormulaException("Empty formula, nothing to do."); |
64 | printf("sOper.isEmpty() == false!\n"); | 64 | try |
65 | if( !sValue.isEmpty() ) | ||
66 | printf("sValue.isEmpty() == false!\n"); | ||
67 | if( !sFunc.isEmpty() ) | ||
68 | printf("sFunc.isEmpty() == false!\n"); | ||
69 | */ | ||
70 | const char *sFormula = sFormulaSrc.getStr(); | ||
71 | for(;;) | ||
72 | { | 65 | { |
73 | uint8_t tNum = nextToken( &sFormula ); | 66 | const char *sFormula = sFormulaSrc.getStr(); |
74 | if( tNum == symEOS ) | 67 | for(;;) |
75 | break; | ||
76 | else if( tNum == symSubtract ) | ||
77 | { | ||
78 | sOper.push( symNegate ); | ||
79 | continue; | ||
80 | } | ||
81 | else if( tNum == symNot ) | ||
82 | { | ||
83 | sOper.push( symNot ); | ||
84 | continue; | ||
85 | } | ||
86 | else if( tNum == symOpenParen ) | ||
87 | { | ||
88 | sOper.push( tNum ); | ||
89 | continue; | ||
90 | } | ||
91 | else if( tNum == symFunction ) | ||
92 | { | ||
93 | sOper.push( symFunction ); | ||
94 | continue; | ||
95 | } | ||
96 | |||
97 | oppart: uint8_t tOpr = nextToken( &sFormula ); | ||
98 | if( tOpr == symEOS ) | ||
99 | { | ||
100 | reduce(); | ||
101 | prec ret = sValue.top(); | ||
102 | sValue.clear(); | ||
103 | sFunc.clear(); | ||
104 | sOper.clear(); | ||
105 | return ret; | ||
106 | } | ||
107 | if( !sOper.isEmpty() && getPrec( sOper.top() ) > getPrec( tOpr ) ) | ||
108 | { | ||
109 | reduce(); | ||
110 | } | ||
111 | if( tOpr != symCloseParen ) | ||
112 | { | 68 | { |
113 | sOper.push( tOpr ); | 69 | uint8_t tNum = nextToken( &sFormula ); |
114 | } | 70 | if( tNum == symSubtract ) |
115 | else | 71 | { |
116 | { | 72 | sOper.push( symNegate ); |
117 | reduce( true ); | 73 | continue; |
118 | goto oppart; | 74 | } |
75 | else if( tNum == symNot ) | ||
76 | { | ||
77 | sOper.push( symNot ); | ||
78 | continue; | ||
79 | } | ||
80 | else if( tNum == symOpenParen ) | ||
81 | { | ||
82 | sOper.push( tNum ); | ||
83 | continue; | ||
84 | } | ||
85 | else if( tNum == symFunction ) | ||
86 | { | ||
87 | sOper.push( symFunction ); | ||
88 | continue; | ||
89 | } | ||
90 | else if( tNum == symEOS ) | ||
91 | { | ||
92 | throw Bu::FormulaException( | ||
93 | "Cannot end with an operator."); | ||
94 | } | ||
95 | |||
96 | oppart: uint8_t tOpr = nextToken( &sFormula ); | ||
97 | if( tOpr == symEOS ) | ||
98 | { | ||
99 | reduce(); | ||
100 | prec ret = sValue.top(); | ||
101 | sValue.clear(); | ||
102 | sFunc.clear(); | ||
103 | sOper.clear(); | ||
104 | return ret; | ||
105 | } | ||
106 | if( !sOper.isEmpty() && getPrec( sOper.top() ) > | ||
107 | getPrec( tOpr ) ) | ||
108 | { | ||
109 | reduce(); | ||
110 | } | ||
111 | if( tOpr != symCloseParen ) | ||
112 | { | ||
113 | sOper.push( tOpr ); | ||
114 | } | ||
115 | else | ||
116 | { | ||
117 | reduce( true ); | ||
118 | goto oppart; | ||
119 | } | ||
119 | } | 120 | } |
120 | } | 121 | } |
121 | prec ret = sValue.top(); | 122 | catch( ... ) |
122 | sValue.clear(); | 123 | { |
123 | sFunc.clear(); | 124 | sValue.clear(); |
124 | sOper.clear(); | 125 | sFunc.clear(); |
125 | return ret; | 126 | sOper.clear(); |
127 | throw; | ||
128 | } | ||
126 | } | 129 | } |
127 | 130 | ||
128 | varHash hVars; | 131 | varHash hVars; |