mirror of https://github.com/mgba-emu/mgba.git
Debugger: Add more operators
This commit is contained in:
parent
c7fdb1e872
commit
821c8988a3
|
@ -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 {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Reference in New Issue