From 8ed9d8b57798e71acd48b2f17e1396494f33edc4 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Sat, 21 Jun 2008 19:11:05 +0000 Subject: [PATCH] Catching more context changes --- src/code.c | 15 ++++++++++++++- src/code.h | 2 ++ src/parser.c | 19 +++++++++++-------- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/code.c b/src/code.c index 5f2d7b5..65e5cad 100644 --- a/src/code.c +++ b/src/code.c @@ -341,9 +341,15 @@ int code_context_set(Code * code, CodeContext context) size_t i; CodeIdentifier * ci; +#ifdef DEBUG + fprintf(stderr, "DEBUG: %s() 0x%x\n", __func__, context); +#endif code->context = context; switch(context) { + case CODE_CONTEXT_ASSIGNMENT: + _code_context_flush(code); + break; case CODE_CONTEXT_DECLARATION: /* handle any DECLARATION_OR_FUNCTION identifier */ for(i = 0; i < code->identifiers_cnt; i++) @@ -396,6 +402,10 @@ int code_context_set(Code * code, CodeContext context) code->identifiers[0].name); } _code_context_flush(code); + break; + case CODE_CONTEXT_STATEMENT: + _code_context_flush(code); + break; default: break; } @@ -418,6 +428,7 @@ int code_context_set_identifier(Code * code, char const * identifier) char const * str[CODE_CONTEXT_COUNT] = { "NULL", + "assignment", "declaration", "declaration end", "declaration or function", @@ -431,9 +442,11 @@ int code_context_set_identifier(Code * code, char const * identifier) "function end", "function parameters", "function start", + "label", "parameters", "parameters type", "primary expr", + "statement", "struct", "union" }; @@ -490,7 +503,7 @@ int code_context_set_storage(Code * code, CodeStorage storage) size_t i; #ifdef DEBUG - fprintf(stderr, "DEBUG: %s(%s)\n", __func__, str[storage]); + fprintf(stderr, "DEBUG: %s(0x%x)\n", __func__, storage); #endif if(!(code->storage & storage)) { diff --git a/src/code.h b/src/code.h index d3ced93..6b542b1 100644 --- a/src/code.h +++ b/src/code.h @@ -32,6 +32,7 @@ typedef struct _Code Code; typedef enum _CodeContext { CODE_CONTEXT_NULL = 0, + CODE_CONTEXT_ASSIGNMENT, CODE_CONTEXT_DECLARATION, CODE_CONTEXT_DECLARATION_END, CODE_CONTEXT_DECLARATION_OR_FUNCTION, @@ -49,6 +50,7 @@ typedef enum _CodeContext CODE_CONTEXT_PARAMETERS, CODE_CONTEXT_PARAMETERS_TYPE, CODE_CONTEXT_PRIMARY_EXPR, + CODE_CONTEXT_STATEMENT, CODE_CONTEXT_STRUCT, CODE_CONTEXT_UNION } CodeContext; diff --git a/src/parser.c b/src/parser.c index e33dbbe..94334f2 100644 --- a/src/parser.c +++ b/src/parser.c @@ -1019,6 +1019,7 @@ static int _assignment_expr(C99 * c99) ret |= _conditional_expr(c99); if(!_parse_in_set(c99, c99set_assignment_operator)) return ret; + ret |= code_context_set(c99->code, CODE_CONTEXT_ASSIGNMENT); ret |= _assignment_operator(c99); } return ret; @@ -1583,21 +1584,23 @@ static int _statement(C99 * c99) * iteration-statement * jump-statement */ { + int ret; + DEBUG_GRAMMAR(); + ret = code_context_set(c99->code, CODE_CONTEXT_STATEMENT); if(_parse_in_set(c99, c99set_labeled_statement)) - return _labeled_statement(c99); + ret |= _labeled_statement(c99); else if(_parse_in_set(c99, c99set_compound_statement)) - return _compound_statement(c99); + ret |= _compound_statement(c99); else if(_parse_in_set(c99, c99set_expression_statement)) - return _expression_statement(c99); + ret |= _expression_statement(c99); else if(_parse_in_set(c99, c99set_selection_statement)) - return _selection_statement(c99); + ret |= _selection_statement(c99); else if(_parse_in_set(c99, c99set_iteration_statement)) - return _iteration_statement(c99); + ret |= _iteration_statement(c99); else if(_parse_in_set(c99, c99set_jump_statement)) - return _jump_statement(c99); - /* XXX should be code bloat now */ - return _parse_error(c99, "Expected statement"); + ret |= _jump_statement(c99); + return ret; }