summaryrefslogtreecommitdiff
path: root/expr.l
diff options
context:
space:
mode:
Diffstat (limited to 'expr.l')
-rw-r--r--expr.l50
1 files changed, 28 insertions, 22 deletions
diff --git a/expr.l b/expr.l
index 7612ebf..d6aa239 100644
--- a/expr.l
+++ b/expr.l
@@ -1,34 +1,42 @@
%{
-#define _XOPEN_SOURCE 2
+#define _XOPEN_SOURCE 700
#include <locale.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
+
#include "expr.h"
+
+#include "y.tab.h"
+
+extern int yyparse(void);
+
%}
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);
+"|" return OR;
+"&" return AND;
+"=" return COMPARISON;
+">" return COMPARISON;
+">=" return COMPARISON;
+"<" return COMPARISON;
+"<=" return COMPARISON;
+"!=" return COMPARISON;
+"+" return '+';
+"-" return '-';;
+"*" return MULTIPLICATION;
+"/" return MULTIPLICATION;
+"%" return MULTIPLICATION;
+"(" return '(';
+")" return ')';
+":" return MATCH;
+{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 ;
%%
@@ -58,11 +66,9 @@ int main(int argc, char *argv[])
for (int i = optind; i < argc; i++) {
fprintf(mem, "%s\n", argv[i]);
}
- fprintf(mem, "\n");
rewind(mem);
yyin = mem;
-
- return yylex();
+ return yyparse();
}