From 8ea8bd7e41c48be9635c29fb928fe9decc4eb112 Mon Sep 17 00:00:00 2001 From: kartofen Date: Thu, 10 Jul 2025 00:28:22 +0300 Subject: shift-reduce did not work, not works (not very good) with no nonassoc --- clr-table.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) (limited to 'clr-table.c') diff --git a/clr-table.c b/clr-table.c index 8f09ef1..7b7e057 100644 --- a/clr-table.c +++ b/clr-table.c @@ -259,10 +259,14 @@ enum symbol { EP, E, L, R, SYMBOLS_END, #else - SC, SD, + IF, ELSE, N, PLUS, TIMES, EQUAL, END_INPUT, - EP, E, C, + EP, E, STMT, SYMBOLS_END + // SC, SD, + // END_INPUT, + // EP, E, C, + // SYMBOLS_END #endif }; @@ -272,7 +276,8 @@ IMPLEMENT_FUNCPTR(int, symbol_is_terminal, (symbol s)) { return s < EP; } IMPLEMENT_FUNCPTR(int, symbol_is_input_end, (symbol s)) { return s == END_INPUT; } // implement grammar.h -#define PROD(LHS, _, ...) {LHS, (symbol[]){__VA_ARGS__}, sizeof((symbol[]){__VA_ARGS__})/sizeof(symbol), 0} +// #define PROD(LHS, _, ...) {LHS, (symbol[]){__VA_ARGS__}, sizeof((symbol[]){__VA_ARGS__})/sizeof(symbol), 0} +#define PROD(P, LHS, _, ...) {LHS, (symbol[]){__VA_ARGS__}, sizeof((symbol[]){__VA_ARGS__})/sizeof(symbol), P} static struct production _grammar[] = { #if (CHOOSE_GRAMMAR == 0) PROD(EP, ->, E, END_INPUT), @@ -282,10 +287,18 @@ static struct production _grammar[] = { PROD(L, -->, ID), PROD(R, -->, L), #else - PROD(EP, ->, E, END_INPUT), - PROD(E, -->, C, C), - PROD(C, -->, SC, C), - PROD(C, -->, SD), + // PROD(EP, ->, E, END_INPUT), + // PROD(E, -->, C, C), + // PROD(C, -->, SC, C), + // PROD(C, -->, SD), + PROD(0, EP, ->, E, END_INPUT), + PROD(0, E, -->, STMT), + PROD(0, STMT, -->, IF, STMT), + PROD(0, STMT, -->, IF, STMT, ELSE, STMT), + PROD(0, STMT, -->, N), + PROD((2 << 2) | (PRECEDENCE_LEFT_ASSOC), STMT, -->, STMT, PLUS, STMT), + PROD((1 << 2) | (PRECEDENCE_NO_ASSOC), STMT, -->, STMT, EQUAL, STMT), + PROD((3 << 2) | (PRECEDENCE_LEFT_ASSOC), STMT, -->, STMT, TIMES, STMT), #endif }; -- cgit v1.2.3