%{ #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(); }