MOHAWK: Fix associativity of LBCode operators.

This commit is contained in:
Alyssa Milburn 2011-07-03 14:18:17 +02:00
parent dd7b1399f3
commit d7f50b925e

View file

@ -277,27 +277,27 @@ LBValue LBCode::runCode(byte terminator) {
void LBCode::parseStatement() { void LBCode::parseStatement() {
parseComparisons(); parseComparisons();
if (_currToken != kTokenAnd && _currToken != kTokenOr) while (_currToken == kTokenAnd || _currToken == kTokenOr) {
return; byte op = _currToken;
byte op = _currToken; if (op == kTokenAnd)
if (op == kTokenAnd) debugN(" && ");
debugN(" && "); else
else debugN(" || ");
debugN(" || ");
nextToken(); nextToken();
parseComparisons(); parseComparisons();
LBValue val2 = _stack.pop(); LBValue val2 = _stack.pop();
LBValue val1 = _stack.pop(); LBValue val1 = _stack.pop();
bool result; bool result;
if (op == kTokenAnd) if (op == kTokenAnd)
result = !val1.isZero() && !val2.isZero(); result = !val1.isZero() && !val2.isZero();
else else
result = !val1.isZero() || !val2.isZero(); result = !val1.isZero() || !val2.isZero();
debugN(" [--> %s]", result ? "true" : "false"); debugN(" [--> %s]", result ? "true" : "false");
_stack.push(result); _stack.push(result);
}
} }
void LBCode::parseComparisons() { void LBCode::parseComparisons() {
@ -365,44 +365,43 @@ void LBCode::parseComparisons() {
void LBCode::parseConcat() { void LBCode::parseConcat() {
parseArithmetic1(); parseArithmetic1();
if (_currToken != kTokenConcat) while (_currToken == kTokenConcat) {
return; debugN(" & ");
nextToken();
parseArithmetic1();
debugN(" & "); LBValue val2 = _stack.pop();
nextToken(); LBValue val1 = _stack.pop();
parseArithmetic1(); Common::String result = val1.toString() + val2.toString();
debugN(" [--> \"%s\"]", result.c_str());
LBValue val2 = _stack.pop(); _stack.push(result);
LBValue val1 = _stack.pop(); }
Common::String result = val1.toString() + val2.toString();
debugN(" [--> \"%s\"]", result.c_str());
_stack.push(result);
} }
void LBCode::parseArithmetic1() { void LBCode::parseArithmetic1() {
parseArithmetic2(); parseArithmetic2();
if (_currToken != kTokenMinus && _currToken != kTokenPlus) while (_currToken == kTokenMinus || _currToken == kTokenPlus) {
return; byte op = _currToken;
if (op == kTokenMinus)
debugN(" - ");
else if (op == kTokenPlus)
debugN(" + ");
byte op = _currToken; nextToken();
if (op == kTokenMinus) parseArithmetic2();
debugN(" - ");
else if (op == kTokenPlus)
debugN(" + ");
nextToken(); LBValue val2 = _stack.pop();
parseArithmetic2(); LBValue val1 = _stack.pop();
LBValue result;
LBValue val2 = _stack.pop(); // TODO: cope with non-integers
LBValue val1 = _stack.pop(); if (op == kTokenMinus)
LBValue result; result = val1.toInt() - val2.toInt();
// TODO: cope with non-integers else
if (op == kTokenMinus) result = val1.toInt() + val2.toInt();
result = val1.toInt() - val2.toInt(); debugN(" [--> %d]", result.toInt());
else _stack.push(result);
result = val1.toInt() + val2.toInt(); }
_stack.push(result);
} }
void LBCode::parseArithmetic2() { void LBCode::parseArithmetic2() {