Permalink
Browse files

Debugger: Improve paren parsing, add lexing tests

  • Loading branch information...
endrift committed Dec 29, 2017
1 parent d7900fd commit 47605b40e73704734a0f4187e323040280ad87d9
Showing with 481 additions and 4 deletions.
  1. +3 −0 CMakeLists.txt
  2. +19 −4 src/debugger/parser.c
  3. +459 −0 src/debugger/test/parser.c
View
@@ -415,6 +415,8 @@ set(DEBUGGER_SRC
${CMAKE_CURRENT_SOURCE_DIR}/src/debugger/symbols.c
${CMAKE_CURRENT_SOURCE_DIR}/src/debugger/cli-debugger.c)
+file(GLOB DEBUGGER_TEST_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/debugger/test/*.c)
+
set(FEATURE_SRC)
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6")
@@ -686,6 +688,7 @@ endif()
if(USE_DEBUGGERS)
list(APPEND FEATURE_SRC ${DEBUGGER_SRC})
+ list(APPEND TEST_SRC ${DEBUGGER_TEST_SRC})
list(APPEND FEATURES DEBUGGERS)
endif()
View
@@ -308,6 +308,11 @@ size_t lexExpression(struct LexVector* lv, const char* string, size_t length) {
_lexOperator(lv, token);
state = LEX_ROOT;
break;
+ case ')':
+ lvNext = LexVectorAppend(lv);
+ lvNext->type = TOKEN_CLOSE_PAREN_TYPE;
+ state = LEX_EXPECT_OPERATOR;
+ break;
default:
state = LEX_ERROR;
}
@@ -332,6 +337,7 @@ size_t lexExpression(struct LexVector* lv, const char* string, size_t length) {
lvNext->type = TOKEN_IDENTIFIER_TYPE;
lvNext->identifierValue = strndup(tokenStart, string - tokenStart);
break;
+ case LEX_ROOT:
case LEX_EXPECT_OPERATOR:
break;
case LEX_EXPECT_BINARY_FIRST:
@@ -369,7 +375,7 @@ static struct ParseTree* _parseTreeCreate() {
return tree;
}
-static size_t _parseExpression(struct ParseTree* tree, struct LexVector* lv, size_t i, int precedence, int openParens) {
+static size_t _parseExpression(struct ParseTree* tree, struct LexVector* lv, size_t i, int precedence, int* openParens) {
struct ParseTree* newTree = 0;
while (i < LexVectorSize(lv)) {
struct Token* token = LexVectorGetPointer(lv, i);
@@ -400,12 +406,14 @@ static size_t _parseExpression(struct ParseTree* tree, struct LexVector* lv, siz
}
break;
case TOKEN_OPEN_PAREN_TYPE:
- i = _parseExpression(tree, lv, i + 1, INT_MAX, openParens + 1);
+ ++*openParens;
+ i = _parseExpression(tree, lv, i + 1, INT_MAX, openParens);
break;
case TOKEN_CLOSE_PAREN_TYPE:
- if (openParens <= 0) {
+ if (*openParens <= 0) {
tree->token.type = TOKEN_ERROR_TYPE;
}
+ --*openParens;
return i + 1;
case TOKEN_OPERATOR_TYPE:
newPrecedence = _operatorPrecedence[token->operatorValue];
@@ -441,7 +449,14 @@ void parseLexedExpression(struct ParseTree* tree, struct LexVector* lv) {
tree->lhs = 0;
tree->rhs = 0;
- _parseExpression(tree, lv, 0, INT_MAX, 0);
+ int openParens = 0;
+ _parseExpression(tree, lv, 0, INT_MAX, &openParens);
+ if (openParens) {
+ if (tree->token.type == TOKEN_IDENTIFIER_TYPE) {
+ free(tree->token.identifierValue);
+ }
+ tree->token.type = TOKEN_ERROR_TYPE;
+ }
}
void lexFree(struct LexVector* lv) {
Oops, something went wrong.

0 comments on commit 47605b4

Please sign in to comment.