aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkartofen <kartofen.mail.0@protonmail.com>2025-07-20 13:02:56 +0300
committerkartofen <kartofen.mail.0@protonmail.com>2025-07-20 13:02:56 +0300
commit1d6f6e7c6a07832b3524871fdec86f5329736598 (patch)
tree60981bf69a19fa84e06e36c10df6c35e0eed733a
parent34357640c0676f33ad13aac1fe28effc6f6e47c7 (diff)
fix precedence
-rwxr-xr-xbuild.sh6
-rw-r--r--demos/generate-parser.c6
-rw-r--r--demos/sample-files/calc-defs.c13
-rw-r--r--demos/sample-files/calc-skeleton.c2
-rw-r--r--parts/precedence.h2
-rw-r--r--parts/table.h1
6 files changed, 15 insertions, 15 deletions
diff --git a/build.sh b/build.sh
index 1fe06a9..e39d4b4 100755
--- a/build.sh
+++ b/build.sh
@@ -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]