aboutsummaryrefslogtreecommitdiff
path: root/demos/sample-files
diff options
context:
space:
mode:
authorkartofen <mladenovnasko0@gmail.com>2025-07-05 12:14:27 +0300
committerkartofen <mladenovnasko0@gmail.com>2025-07-05 12:14:27 +0300
commit0e0c0e0f26fcd669e45604fd5d9bcc2891a932a2 (patch)
treef57eb9f80883bdab57d00a97ad97508ecdbb0c2d /demos/sample-files
parentf2bef76fb369d4c9c3e53dca60eb78b75bb02d97 (diff)
lalr now acutally works
Diffstat (limited to 'demos/sample-files')
-rw-r--r--demos/sample-files/parser-skeleton.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/demos/sample-files/parser-skeleton.c b/demos/sample-files/parser-skeleton.c
index facbc1b..031d829 100644
--- a/demos/sample-files/parser-skeleton.c
+++ b/demos/sample-files/parser-skeleton.c
@@ -18,13 +18,33 @@ enum symbol {
SYMBOLS_END,
};
-static symbol toklist[] = {N0, PLUS, N1, END_INPUT};
-static symbol *tok = toklist;
+static inline symbol char_to_token(char c)
+{
+ switch(c) {
+ case '+': return PLUS;
+ case '-': return MINUS;
+ case '(': return LPAREN;
+ case ')': return RPAREN;
+ case '0': return N0;
+ case '1': return N1;
+ case 0 : return END_INPUT;
+ default: fprintf(stderr, "ERROR: Unknown character '%c'\n", c); exit(1);
+ }
+}
-symbol toklist_eat() { return *(tok++); } // unsafe
-symbol toklist_peek() { return *tok; } // unsafe
+static char *input;
-int main(void)
+symbol toklist_eat() { return char_to_token(*(input++)); } // unsafe
+symbol toklist_peek() { return char_to_token(*input); } // unsafe
+
+int main(int argc, char **argv)
{
+ if(argc != 2) {
+ fprintf(stderr, "ERROR: Not enough arguments\n");
+ return 1;
+ }
+
+ input = argv[1];
+
return lr_parser();
}