diff options
| author | kartofen <kartofen.mail.0@protonmail.com> | 2025-08-26 01:17:10 +0300 |
|---|---|---|
| committer | kartofen <kartofen.mail.0@protonmail.com> | 2025-08-26 01:17:10 +0300 |
| commit | 46e786db9d1b48b8fbc3502e36f093b755f3e09f (patch) | |
| tree | 9e279216e68f3fe4b0849d1e07184fe674dc551f /lr-parser.c | |
| parent | 1c83c514c8108fccfec9764da5e4563b98eb871b (diff) | |
grammar for the grammar and lexing and parsing of a new language lbp
Diffstat (limited to 'lr-parser.c')
| -rw-r--r-- | lr-parser.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/lr-parser.c b/lr-parser.c index bca8a52..336c222 100644 --- a/lr-parser.c +++ b/lr-parser.c @@ -21,11 +21,19 @@ typedef intmax_t stack_item; static stack_item stack_bottom[STACK_CAP]; static stack_item *stack_head = stack_bottom; +static void print_stack() +{ + fprintf(stderr, "STACK: { "); + for(stack_item *s = stack_bottom+1; s <= stack_head; s += 3) + fprintf(stderr, "%s ", symbol_to_str[*(symbol *)s]); + fprintf(stderr, "}\n\n"); +} + int lr_parser(intptr_t *value) { #define push(item) do { \ if(++stack_head - stack_bottom < STACK_CAP ) *stack_head = item; \ - else { fprintf(stderr, "ERROR: STACK_CAP exceeded\n"); return 1; } \ + else { fprintf(stderr, "ERROR: STACK_CAP exceeded\n"); print_stack(); return 1; } \ } while(0) #define pop() (--stack_head) #define eat() toklist_eat() @@ -41,6 +49,10 @@ int lr_parser(intptr_t *value) push(token_sym(t)); push(token_val(t)); push(a.arg); +#ifdef _LR_PARSER_DEBUG + fprintf(stderr, "SHIFT %s\n", symbol_to_str[token_sym(t)]); + print_stack(); +#endif break; case ACTION_REDUCE: intptr_t semantic_value = semantic_actions[a.arg](stack_head); @@ -58,6 +70,9 @@ int lr_parser(intptr_t *value) push(lhs); push(semantic_value); push(a_goto.arg); +#ifdef _LR_PARSER_DEBUG + fprintf(stderr, "READUCE %s\n", symbol_to_str[lhs]); +#endif break; case ACTION_ACCEPT: for(size_t i = 0; i < 3; i++) push(0); // todo: better fix for reducing the final production expecting an END_INPUT on the stack @@ -66,8 +81,10 @@ int lr_parser(intptr_t *value) case ACTION_NOT_SET: default: fprintf(stderr, - "ERROR: Unexpected symbol '%d' at state %zu\n", - token_sym(peek()), (size_t)*stack_head); + "ERROR: Unexpected symbol '%s' at state %zu\n", + symbol_to_str[token_sym(peek())], (size_t)*stack_head); + // Expected ... + print_stack(); return 1; } } |
