diff options
| author | kartofen <kartofen.mail.0@protonmail.com> | 2025-07-20 13:02:56 +0300 |
|---|---|---|
| committer | kartofen <kartofen.mail.0@protonmail.com> | 2025-07-20 13:02:56 +0300 |
| commit | 1d6f6e7c6a07832b3524871fdec86f5329736598 (patch) | |
| tree | 60981bf69a19fa84e06e36c10df6c35e0eed733a | |
| parent | 34357640c0676f33ad13aac1fe28effc6f6e47c7 (diff) | |
fix precedence
| -rwxr-xr-x | build.sh | 6 | ||||
| -rw-r--r-- | demos/generate-parser.c | 6 | ||||
| -rw-r--r-- | demos/sample-files/calc-defs.c | 13 | ||||
| -rw-r--r-- | demos/sample-files/calc-skeleton.c | 2 | ||||
| -rw-r--r-- | parts/precedence.h | 2 | ||||
| -rw-r--r-- | parts/table.h | 1 |
6 files changed, 15 insertions, 15 deletions
@@ -70,9 +70,9 @@ shared demos/sample-files/lalr-defs # shared demos/sample-files/calc-defs # leak generate-parser "-o bin/calc -t lalr-table bin/calc-defs.so" # cc demos/sample-files/calc-skeleton "" parser -# leak parser "13*10+9 - (54*(10+8))" # wrong answer -# leak parser "-13 + 20" -# leak parser "1 > 52 ? 2 + 3 : 53" +# leak parser "13*10+9" # wrong answer +# leak parser "-13+20" +# leak parser "1>52?2+3:53" # --- Grammar Definitino example --- shared demos/sample-files/gram-defs diff --git a/demos/generate-parser.c b/demos/generate-parser.c index 48fa48c..9987265 100644 --- a/demos/generate-parser.c +++ b/demos/generate-parser.c @@ -137,7 +137,7 @@ int main(int argc, char **argv) set_stdout(add_extension(output_path, ".c")); printf("size_t total_symbols = %zu;\n", total_symbols); - printf("char **symbol_to_string = (char *([])){\n"); + printf("char **symbol_to_str = (char *([])){\n"); for(size_t i = 0; i < total_symbols; i++) printf("\"%s\", ", symbol_to_str[i]); printf("};\n"); printf("IMPLEMENT_FUNCPTR(int, symbol_is_valid, (symbol s)) {return s < total_symbols;}\n"); @@ -210,9 +210,9 @@ void precedence_tables_fill() for(size_t i = 0; i < nprecedence_defs; i++) for(size_t j = 0; j < precedence_defs[i].nlist; j++) if(precedence_defs[i].list[j] >= 0) - precedence_symbol[precedence_defs[i].list[j]] = PRECEDENCE_SET(precedence_defs[i].flag, i+1); + precedence_symbol[precedence_defs[i].list[j]] = PRECEDENCE_SET(precedence_defs[i].flag, nprecedence_defs-i); else - precedence_production[~precedence_defs[i].list[j]] = PRECEDENCE_SET(precedence_defs[i].flag, i+1); + precedence_production[~precedence_defs[i].list[j]] = PRECEDENCE_SET(precedence_defs[i].flag, nprecedence_defs-i); for(size_t i = 0; i < total_productions; i++) { if(precedence_production[i]) continue; diff --git a/demos/sample-files/calc-defs.c b/demos/sample-files/calc-defs.c index 103b69e..b9d1788 100644 --- a/demos/sample-files/calc-defs.c +++ b/demos/sample-files/calc-defs.c @@ -1,6 +1,6 @@ #include "util/util.h" #define SYMBOLS(X) \ - X(PLUS) X(MINUS) X(TIMES) X(MORE) X(LESS) X(EQUA) \ + X(PLUS) X(MINUS) X(TIMES) X(MORE) X(LESS) X(EQUA) \ X(LPAREN) X(RPAREN) \ X(QMARK) X(COLON) \ X(NUM) X(END_INPUT) \ @@ -61,14 +61,13 @@ struct precedence_def { size_t nlist; }; #define PREC(f, ...) {f, (int[]){__VA_ARGS__}, sizeof((int[]){__VA_ARGS__})/sizeof(int)} -#define USE_PROD(n) (~(n)) struct precedence_def _precedence_defs[] = { - PREC(0, QMARK), - PREC(0, USE_PROD(7)), - PREC(PRECEDENCE_LEFT_ASSOC, MORE, LESS, EQUA), + PREC(PRECEDENCE_LEFT_ASSOC, LPAREN), + PREC(PRECEDENCE_LEFT_ASSOC, TIMES), PREC(PRECEDENCE_LEFT_ASSOC, MINUS, PLUS), - PREC(PRECEDENCE_LEFT_ASSOC, TIMES, USE_PROD(5)), - PREC(PRECEDENCE_LEFT_ASSOC, LPAREN, RPAREN), + PREC(PRECEDENCE_LEFT_ASSOC, MORE, LESS, EQUA), + PREC(0, COLON, ~7), + PREC(0, QMARK), }; struct precedence_def *precedence_defs = _precedence_defs; diff --git a/demos/sample-files/calc-skeleton.c b/demos/sample-files/calc-skeleton.c index 6e5d2d5..ad4aba9 100644 --- a/demos/sample-files/calc-skeleton.c +++ b/demos/sample-files/calc-skeleton.c @@ -7,6 +7,8 @@ #include "bin/calc.h" #include "bin/calc.c" +#include "parts/grammar.h" +#include "parts/precedence.h" #include "parts/toklist.h" static struct token { symbol s; diff --git a/parts/precedence.h b/parts/precedence.h index 37e54c6..6fe40db 100644 --- a/parts/precedence.h +++ b/parts/precedence.h @@ -7,7 +7,7 @@ enum precedence_flag { // PRECEDENCE_NO_ASSOC, }; -#define PRECEDENCE_SET(num, flag) (((num) << 1 /*2*/) | (flag)) +#define PRECEDENCE_SET(flag, num) (((num) << 2 /*2*/) | (flag)) #define PRECEDENCE_NUM(prec) ((prec) >> 2) #define PRECEDENCE_FLAG(prec) ((prec) & 0x3) diff --git a/parts/table.h b/parts/table.h index c60ad4f..b768b1a 100644 --- a/parts/table.h +++ b/parts/table.h @@ -87,7 +87,6 @@ int table_insert(size_t state, symbol sym, struct action a) } if(shift_reduce) { - report = 1; shift_p = precedence_symbol[sym]; reduce_p = (tbl_is_reduce) ? precedence_production[tbl_a->arg] |
