Support identifiers

This commit is contained in:
Jeffrey Pfau 2014-07-12 17:25:51 -07:00
parent b89d6216ac
commit a58f8f8675
2 changed files with 32 additions and 4 deletions

View File

@ -300,13 +300,41 @@ static uint32_t _performOperation(enum Operation operation, uint32_t current, ui
return current; return current;
} }
static uint32_t _evaluateParseTree(struct ParseTree* tree, struct DebugVector* dv) { static uint32_t _lookupIdentifier(struct ARMDebugger* debugger, const char* name, struct DebugVector* dv) {
if (strcmp(name, "sp") == 0) {
return debugger->cpu->gprs[ARM_SP];
}
if (strcmp(name, "lr") == 0) {
return debugger->cpu->gprs[ARM_LR];
}
if (strcmp(name, "pc") == 0) {
return debugger->cpu->gprs[ARM_PC];
}
if (strcmp(name, "cpsr") == 0) {
return debugger->cpu->cpsr.packed;
}
// TODO: test if mode has SPSR
if (strcmp(name, "spsr") == 0) {
return debugger->cpu->spsr.packed;
}
if (name[0] == 'r' && name[1] >= '0' && name[1] <= '9') {
int reg = atoi(&name[1]);
if (reg < 16) {
return debugger->cpu->gprs[reg];
}
}
dv->type = DV_ERROR_TYPE;
return 0;
}
static uint32_t _evaluateParseTree(struct ARMDebugger* debugger, struct ParseTree* tree, struct DebugVector* dv) {
switch (tree->token.type) { switch (tree->token.type) {
case TOKEN_UINT_TYPE: case TOKEN_UINT_TYPE:
return tree->token.uintValue; return tree->token.uintValue;
case TOKEN_OPERATOR_TYPE: case TOKEN_OPERATOR_TYPE:
return _performOperation(tree->token.operatorValue, _evaluateParseTree(tree->lhs, dv), _evaluateParseTree(tree->rhs, dv), dv); return _performOperation(tree->token.operatorValue, _evaluateParseTree(debugger, tree->lhs, dv), _evaluateParseTree(debugger, tree->rhs, dv), dv);
case TOKEN_IDENTIFIER_TYPE: case TOKEN_IDENTIFIER_TYPE:
return _lookupIdentifier(debugger, tree->token.identifierValue, dv);
case TOKEN_ERROR_TYPE: case TOKEN_ERROR_TYPE:
dv->type = DV_ERROR_TYPE; dv->type = DV_ERROR_TYPE;
} }
@ -332,7 +360,7 @@ static struct DebugVector* _DVParse(struct CLIDebugger* debugger, const char* st
if (tree.token.type == TOKEN_ERROR_TYPE) { if (tree.token.type == TOKEN_ERROR_TYPE) {
dvTemp.type = DV_ERROR_TYPE; dvTemp.type = DV_ERROR_TYPE;
} else { } else {
dvTemp.intValue = _evaluateParseTree(&tree, &dvTemp); dvTemp.intValue = _evaluateParseTree(&debugger->d, &tree, &dvTemp);
} }
parseFree(tree.lhs); parseFree(tree.lhs);

View File

@ -84,7 +84,7 @@ size_t lexExpression(struct LexVector* lv, const char* string, size_t length) {
case '*': case '*':
case '/': case '/':
lv->token.type = TOKEN_IDENTIFIER_TYPE; lv->token.type = TOKEN_IDENTIFIER_TYPE;
lv->token.identifierValue = strndup(tokenStart, string - tokenStart); lv->token.identifierValue = strndup(tokenStart, string - tokenStart - 1);
lv = _lexOperator(lv, token); lv = _lexOperator(lv, token);
state = LEX_ROOT; state = LEX_ROOT;
break; break;