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> #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 { enum Operation {
OP_ASSIGN, OP_ASSIGN,
OP_ADD, OP_ADD,
OP_SUBTRACT, OP_SUBTRACT,
OP_MULTIPLY, OP_MULTIPLY,
OP_DIVIDE OP_DIVIDE,
OP_AND,
OP_OR,
OP_XOR,
OP_LESS,
OP_GREATER,
OP_EQUAL,
OP_LE,
OP_GE,
}; };
struct Token { struct Token {

View File

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

View File

@ -7,6 +7,17 @@
#include <mgba-util/string.h> #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) { static struct LexVector* _lexOperator(struct LexVector* lv, char operator) {
struct LexVector* lvNext = malloc(sizeof(struct LexVector)); struct LexVector* lvNext = malloc(sizeof(struct LexVector));
lvNext->token.type = TOKEN_OPERATOR_TYPE; lvNext->token.type = TOKEN_OPERATOR_TYPE;
@ -23,6 +34,15 @@ static struct LexVector* _lexOperator(struct LexVector* lv, char operator) {
case '/': case '/':
lvNext->token.operatorValue = OP_DIVIDE; lvNext->token.operatorValue = OP_DIVIDE;
break; break;
case '&':
lvNext->token.operatorValue = OP_AND;
break;
case '|':
lvNext->token.operatorValue = OP_OR;
break;
case '^':
lvNext->token.operatorValue = OP_XOR;
break;
default: default:
lvNext->token.type = TOKEN_ERROR_TYPE; lvNext->token.type = TOKEN_ERROR_TYPE;
break; break;
@ -102,6 +122,9 @@ size_t lexExpression(struct LexVector* lv, const char* string, size_t length) {
case '-': case '-':
case '*': case '*':
case '/': case '/':
case '&':
case '|':
case '^':
lv->token.type = TOKEN_IDENTIFIER_TYPE; lv->token.type = TOKEN_IDENTIFIER_TYPE;
lv->token.identifierValue = strndup(tokenStart, string - tokenStart - 1); lv->token.identifierValue = strndup(tokenStart, string - tokenStart - 1);
lv = _lexOperator(lv, token); 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 '/':
case '&':
case '|':
case '^':
lv->token.type = TOKEN_UINT_TYPE; lv->token.type = TOKEN_UINT_TYPE;
lv->token.uintValue = next; lv->token.uintValue = next;
lv = _lexOperator(lv, token); 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 '/':
case '&':
case '|':
case '^':
lv->token.type = TOKEN_UINT_TYPE; lv->token.type = TOKEN_UINT_TYPE;
lv->token.uintValue = next; lv->token.uintValue = next;
lv = _lexOperator(lv, token); 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 '/':
case '&':
case '|':
case '^':
lv->token.type = TOKEN_UINT_TYPE; lv->token.type = TOKEN_UINT_TYPE;
lv->token.uintValue = next; lv->token.uintValue = next;
lv = _lexOperator(lv, token); 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 '/':
case '&':
case '|':
case '^':
lvNext = malloc(sizeof(struct LexVector)); lvNext = malloc(sizeof(struct LexVector));
lvNext->next = lv->next; lvNext->next = lv->next;
lvNext->token.type = TOKEN_CLOSE_PAREN_TYPE; 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[] = { static const int _operatorPrecedence[] = {
2, 14,
1, 4,
1, 4,
0, 3,
0 3,
8,
10,
9,
6,
6,
7,
6,
6
}; };
static struct ParseTree* _parseTreeCreate() { static struct ParseTree* _parseTreeCreate() {
@ -421,7 +464,7 @@ void parseLexedExpression(struct ParseTree* tree, struct LexVector* lv) {
tree->lhs = 0; tree->lhs = 0;
tree->rhs = 0; tree->rhs = 0;
_parseExpression(tree, lv, _operatorPrecedence[OP_ASSIGN], 0); _parseExpression(tree, lv, INT_MAX, 0);
} }
void lexFree(struct LexVector* lv) { void lexFree(struct LexVector* lv) {