%{ #define _XOPEN_SOURCE 700 #include #include #include #include #include "expr.h" #include "y.tab.h" extern int yyparse(void); %} DIGIT [0-9] %% "|" return '|'; "&" return '&'; "=" return '='; ">" return '>'; ">=" return GE; "<" return '<'; "<=" return LE; "!=" return NE; "+" return '+'; "-" return '-'; "*" return '*'; "/" return '/'; "%" return '%'; "(" return '('; ")" return ')'; ":" return ':'; {DIGIT}+ { yylval.u.i = atoi(yytext); return yylval.type = INTEGER; } -{DIGIT}+ { yylval.u.i = atoi(yytext); return yylval.type = INTEGER; } .+ { yylval.u.s = strdup(yytext); return yylval.type = STRING; } \n ; %% 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]); } rewind(mem); yyin = mem; return yyparse(); }