diff options
Diffstat (limited to 'demos/sample-files/calc-skeleton.c')
| -rw-r--r-- | demos/sample-files/calc-skeleton.c | 91 |
1 files changed, 47 insertions, 44 deletions
diff --git a/demos/sample-files/calc-skeleton.c b/demos/sample-files/calc-skeleton.c index b0cbf00..6e5d2d5 100644 --- a/demos/sample-files/calc-skeleton.c +++ b/demos/sample-files/calc-skeleton.c @@ -1,30 +1,57 @@ #include <stdio.h> #include <string.h> +#include <stdint.h> #include <ctype.h> -#include "lr-parser.c" -#include "bin/a.c" // generated - -// these should come from a generated -// header file by the parser generator -#include "parts/symbol.h" -enum symbol { - PLUS, MINUS, TIMES, - LPAREN, RPAREN, - NUM, END_INPUT, - - EP, E, T, - SYMBOLS_END, -}; +// generated +#include "bin/calc.h" +#include "bin/calc.c" +#include "parts/toklist.h" static struct token { symbol s; int v; } tok; +static char *next_token(char *str); + +symbol token_sym(struct token *t) { return t->s; } +intptr_t token_val(struct token *t) { return (intptr_t)t->v; } + +static char *input; + +struct token *toklist_eat() +{ + static struct token t; + t = tok; + input = next_token(input); + return &t; +} + +struct token *toklist_peek() { return &tok; } + +#include "lr-parser.c" + +int main(int argc, char **argv) +{ + if(argc != 2) return 1; + + input = next_token(argv[1]); + + intptr_t value; + if(lr_parser(&value)) return 1; + + printf("INPUT: '%s'\n", argv[1]); + printf("OUTPUT: %jd\n", value); + + return 0; +} + +// LEXER + static inline int issep(char c) { - return isspace(c) || c == '\0' || c == '(' || c == ')' || c == '+' || c == '-' || c == '*';; + return isspace(c) || c == '\0' || c == '(' || c == ')' || c == '+' || c == '-' || c == '*' || c == '>' || c == '<' || c == '=' || c == '?' || c == ':'; } static inline int tillsep(char *str) @@ -59,6 +86,11 @@ static char *next_token(char *str) case '-': tok.s = MINUS; break; case '+': tok.s = PLUS; break; case '*': tok.s = TIMES; break; + case '>': tok.s = MORE; break; + case '<': tok.s = LESS; break; + case '=': tok.s = EQUA; break; + case '?': tok.s = QMARK; break; + case ':': tok.s = COLON; break; } } else if(c0 >= '0' && c0 <= '9') { // num tok.s = NUM; @@ -68,32 +100,3 @@ static char *next_token(char *str) return str+off; } - -static char *input; - -symbol token_sym(struct token *t) { return t->s; } -int token_val(struct token *t) { return t->v; } - -struct token *toklist_eat() -{ - static struct token t; - t = tok; - input = next_token(input); - return &t; -} -struct token *toklist_peek() { return &tok; } - -int main(int argc, char **argv) -{ - if(argc != 2) return 1; - - input = next_token(argv[1]); - - int value; - if(lr_parser(&value)) return 1; - - printf("INPUT: '%s'\n", argv[1]); - printf("OUTPUT: %d\n", value); - - return 0; -} |
