diff --git a/day_1/lexer.l b/day_1/lexer.l index 6e92a74..0518bdb 100644 --- a/day_1/lexer.l +++ b/day_1/lexer.l @@ -27,8 +27,8 @@ NUM [0-9] return NEWLINE; } {NUM}+ { - unsigned num = strtoul(yytext, NULL, 10); - printf("number: %d\n", num); + unsigned long num = strtoul(yytext, NULL, 10); + // printf("number: %d\n", num); yylval->num = num; return NUMBER; } @@ -41,13 +41,3 @@ NUM [0-9] } %% - -/*int main() {*/ - /*std::cout << "hello" << std::endl;*/ - - /*yyFlexLexer scanner;*/ - /*scanner.yylex();*/ - - /*std::cout << "done" << std::endl;*/ - /*return 0;*/ -/*}*/ diff --git a/day_1/parser.y b/day_1/parser.y index 7818687..9cb47dc 100644 --- a/day_1/parser.y +++ b/day_1/parser.y @@ -4,6 +4,17 @@ /* write out a header file containing the token defines */ %header +// Code for the header file generated by bison +%code requires { + typedef void* yyscan_t; + + struct parser_state { + unsigned long tmp_val; + unsigned long* calorie_list; + unsigned long size; + }; +} + // Code for the c file %{ #include @@ -13,7 +24,7 @@ void push_value(struct parser_state* state) { // TODO(feliix42): error handling here? - state->calorie_list = realloc(state->calorie_list, state->size+1); + state->calorie_list = realloc(state->calorie_list, (state->size+1) * sizeof(unsigned long)); state->calorie_list[state->size] = state->tmp_val; state->tmp_val = 0; state->size++; @@ -26,17 +37,6 @@ } %} -// Code for the header file generated by bison -%code requires { - typedef void* yyscan_t; - - struct parser_state { - unsigned tmp_val; - unsigned* calorie_list; - size_t size; - }; -} - // define a reentrant parser %define api.pure @@ -55,24 +55,25 @@ %start input -%token NEWLINE END_OF_FILE -%token NUMBER +%token NEWLINE +%token NUMBER +%term END_OF_FILE %% input : line input - | END_OF_FILE { /* done. */ } + | END_OF_FILE { if (state->tmp_val != 0) { push_value(state); } return 0; } ; line - : NUMBER NEWLINE { state->tmp_val += yylval.num; } + : NUMBER NEWLINE { state->tmp_val += $1; } | NEWLINE { push_value(state); } ; %% -int main(int argc, char** argv) { +int main(void) { struct parser_state* parser_state = calloc(1, sizeof(struct parser_state)); if (!parser_state) { fprintf(stderr, "[error] failed to allocate parser state\n"); @@ -82,7 +83,6 @@ int main(int argc, char** argv) { yyscan_t scanner; /*YY_BUFFER_STATE state;*/ - printf("Hello World\n"); if (yylex_init(&scanner)) { fprintf(stderr, "\033[91m[error] Could not initialize lexer\n"); return EXIT_FAILURE; @@ -97,14 +97,14 @@ int main(int argc, char** argv) { yylex_destroy(scanner); // task 1.1 - unsigned max_val = 0; - for (int i = 0; i < parser_state->size; i++) { + unsigned long max_val = 0; + for (unsigned long i = 0; i < parser_state->size; i++) { if (parser_state->calorie_list[i] > max_val) { max_val = parser_state->calorie_list[i]; } } - printf("Largest individual calorie load: %d\n", max_val); + printf("Largest individual calorie load: %lu\n", max_val); return 0; diff --git a/day_1/state.c b/day_1/state.c deleted file mode 100644 index 3323891..0000000 --- a/day_1/state.c +++ /dev/null @@ -1,15 +0,0 @@ -#include - -struct parser_state { - unsigned tmp_val; - unsigned* calorie_list; - size_t size; -}; - -void push_value(struct parser_state* state) { - // TODO(feliix42): error handling here? - state->calorie_list = realloc(state->calorie_list, state->size+1); - state->calorie_list[state->size] = state->tmp_val; - state->tmp_val = 0; - state->size++; -}