From 028f700584306cd465ddb18231ecc41c17418082 Mon Sep 17 00:00:00 2001 From: Jakob Kaivo Date: Sun, 17 Apr 2022 14:26:10 -0400 Subject: initial commit recognizing tokens --- Makefile | 7 +++++++ expr.h | 0 expr.l | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 Makefile create mode 100644 expr.h create mode 100644 expr.l diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..5fda526 --- /dev/null +++ b/Makefile @@ -0,0 +1,7 @@ +expr: expr.c + $(CC) -g -o $@ expr.c -ll + +expr.c: expr.l + lex -t expr.l > expr.c + + diff --git a/expr.h b/expr.h new file mode 100644 index 0000000..e69de29 diff --git a/expr.l b/expr.l new file mode 100644 index 0000000..7612ebf --- /dev/null +++ b/expr.l @@ -0,0 +1,68 @@ +%{ +#define _XOPEN_SOURCE 2 +#include +#include +#include +#include +#include "expr.h" +%} + +DIGIT [0-9] + +%% + +"|" puts("or"); +"&" puts("and"); +"=" puts("equal"); +">" puts("greater"); +">=" puts("greater or equal"); +"<" puts("less"); +"<=" puts("less or equal"); +"!=" puts("not equal"); +"+" puts("plus"); +"-" puts("minus"); +"*" puts("times"); +"/" puts("divide"); +"%" puts("remainder"); +"(" puts("lparen"); +")" puts("rparen"); +{DIGIT}+ printf("number %s\n", yytext); +-{DIGIT}+ printf("negative %s\n", yytext); +.+ printf("string '%s'\n", yytext); + +%% + +int main(int argc, char *argv[]) +{ + setlocale(LC_ALL, ""); + + int c; + while ((c = getopt(argc, argv, "")) != -1) { + switch (c) { + default: + return -1; + } + } + + if (optind >= argc) { + fprintf(stderr, "expr: missing operands\n"); + return 1; + } + + size_t n = 1; + for (int i = optind; i < argc; i++) { + n += strlen(argv[i]) + 1; + } + + FILE *mem = fmemopen(NULL, n, "w+"); + for (int i = optind; i < argc; i++) { + fprintf(mem, "%s\n", argv[i]); + } + fprintf(mem, "\n"); + rewind(mem); + + yyin = mem; + + + return yylex(); +} -- cgit v1.2.1