Debugger: Add more operators

This commit is contained in:
Vicki Pfau 2017-12-27 20:57:33 -05:00
parent c7fdb1e872
commit 821c8988a3
3 changed files with 67 additions and 18 deletions

View File

@ -12,23 +12,20 @@ CXX_GUARD_START
#include <mgba/debugger/debugger.h>
enum LexState {
LEX_ERROR = -1,
LEX_ROOT = 0,
LEX_EXPECT_IDENTIFIER,
LEX_EXPECT_BINARY,
LEX_EXPECT_DECIMAL,
LEX_EXPECT_HEX,
LEX_EXPECT_PREFIX,
LEX_EXPECT_OPERATOR
};
enum Operation {
OP_ASSIGN,
OP_ADD,
OP_SUBTRACT,
OP_MULTIPLY,
OP_DIVIDE
OP_DIVIDE,
OP_AND,
OP_OR,
OP_XOR,
OP_LESS,
OP_GREATER,
OP_EQUAL,
OP_LE,
OP_GE,
};
struct Token {

View File

@ -560,6 +560,15 @@ static uint32_t _performOperation(enum Operation operation, uint32_t current, ui
return 0;
}
break;
case OP_AND:
current &= next;
break;
case OP_OR:
current |= next;
break;
case OP_XOR:
current ^= next;
break;
}
return current;
}

View File

@ -7,6 +7,17 @@
#include <mgba-util/string.h>
enum LexState {
LEX_ERROR = -1,
LEX_ROOT = 0,
LEX_EXPECT_IDENTIFIER,
LEX_EXPECT_BINARY,
LEX_EXPECT_DECIMAL,
LEX_EXPECT_HEX,
LEX_EXPECT_PREFIX,
LEX_EXPECT_OPERATOR
};
static struct LexVector* _lexOperator(struct LexVector* lv, char operator) {
struct LexVector* lvNext = malloc(sizeof(struct LexVector));
lvNext->token.type = TOKEN_OPERATOR_TYPE;
@ -23,6 +34,15 @@ static struct LexVector* _lexOperator(struct LexVector* lv, char operator) {
case '/':
lvNext->token.operatorValue = OP_DIVIDE;
break;
case '&':
lvNext->token.operatorValue = OP_AND;
break;
case '|':
lvNext->token.operatorValue = OP_OR;
break;
case '^':
lvNext->token.operatorValue = OP_XOR;
break;
default:
lvNext->token.type = TOKEN_ERROR_TYPE;
break;
@ -102,6 +122,9 @@ size_t lexExpression(struct LexVector* lv, const char* string, size_t length) {
case '-':
case '*':
case '/':
case '&':
case '|':
case '^':
lv->token.type = TOKEN_IDENTIFIER_TYPE;
lv->token.identifierValue = strndup(tokenStart, string - tokenStart - 1);
lv = _lexOperator(lv, token);
@ -163,6 +186,9 @@ size_t lexExpression(struct LexVector* lv, const char* string, size_t length) {
case '-':
case '*':
case '/':
case '&':
case '|':
case '^':
lv->token.type = TOKEN_UINT_TYPE;
lv->token.uintValue = next;
lv = _lexOperator(lv, token);
@ -217,6 +243,9 @@ size_t lexExpression(struct LexVector* lv, const char* string, size_t length) {
case '-':
case '*':
case '/':
case '&':
case '|':
case '^':
lv->token.type = TOKEN_UINT_TYPE;
lv->token.uintValue = next;
lv = _lexOperator(lv, token);
@ -259,6 +288,9 @@ size_t lexExpression(struct LexVector* lv, const char* string, size_t length) {
case '-':
case '*':
case '/':
case '&':
case '|':
case '^':
lv->token.type = TOKEN_UINT_TYPE;
lv->token.uintValue = next;
lv = _lexOperator(lv, token);
@ -292,6 +324,9 @@ size_t lexExpression(struct LexVector* lv, const char* string, size_t length) {
case '-':
case '*':
case '/':
case '&':
case '|':
case '^':
lvNext = malloc(sizeof(struct LexVector));
lvNext->next = lv->next;
lvNext->token.type = TOKEN_CLOSE_PAREN_TYPE;
@ -336,11 +371,19 @@ size_t lexExpression(struct LexVector* lv, const char* string, size_t length) {
}
static const int _operatorPrecedence[] = {
2,
1,
1,
0,
0
14,
4,
4,
3,
3,
8,
10,
9,
6,
6,
7,
6,
6
};
static struct ParseTree* _parseTreeCreate() {
@ -421,7 +464,7 @@ void parseLexedExpression(struct ParseTree* tree, struct LexVector* lv) {
tree->lhs = 0;
tree->rhs = 0;
_parseExpression(tree, lv, _operatorPrecedence[OP_ASSIGN], 0);
_parseExpression(tree, lv, INT_MAX, 0);
}
void lexFree(struct LexVector* lv) {