aboutsummaryrefslogtreecommitdiff
path: root/demos/sample-files/parser-skeleton.c
diff options
context:
space:
mode:
Diffstat (limited to 'demos/sample-files/parser-skeleton.c')
-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();
}