aboutsummaryrefslogtreecommitdiff
path: root/lr-parser.c
diff options
context:
space:
mode:
authorkartofen <kartofen.mail.0@protonmail.com>2025-08-26 01:17:10 +0300
committerkartofen <kartofen.mail.0@protonmail.com>2025-08-26 01:17:10 +0300
commit46e786db9d1b48b8fbc3502e36f093b755f3e09f (patch)
tree9e279216e68f3fe4b0849d1e07184fe674dc551f /lr-parser.c
parent1c83c514c8108fccfec9764da5e4563b98eb871b (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.c23
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;
}
}