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 /demos | |
| parent | 34357640c0676f33ad13aac1fe28effc6f6e47c7 (diff) | |
fix precedence
Diffstat (limited to 'demos')
| -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 |
3 files changed, 11 insertions, 10 deletions
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; |
