summaryrefslogtreecommitdiff
path: root/bc.l
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2019-03-13 20:59:41 -0400
committerJakob Kaivo <jkk@ung.org>2019-03-13 20:59:41 -0400
commit8ab5902d2cb66809d478ef795a878a413dea41cc (patch)
treea2d4f9cba84dbb481d4c988537f608c8e788f710 /bc.l
migrate to gitlab
Diffstat (limited to 'bc.l')
-rw-r--r--bc.l75
1 files changed, 75 insertions, 0 deletions
diff --git a/bc.l b/bc.l
new file mode 100644
index 0000000..3fdb7ae
--- /dev/null
+++ b/bc.l
@@ -0,0 +1,75 @@
+%{
+#define _XOPEN_SOURCE 700
+#include "bc.h"
+#include "y.tab.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+int fileno(FILE *);
+%}
+
+DIGIT [0-9A-F]
+LETTER [a-z]
+WHITESPACE [ \t\f\v]
+MUL_OPS [*/%]
+
+%x COMMENT
+
+%%
+"/*" { BEGIN COMMENT; }
+<COMMENT>"*/" { BEGIN INITIAL; }
+<COMMENT>.|\n ;
+
+{DIGIT}+ { bc_char += strlen(yytext); yylval.num = bc_new(yytext); return NUMBER; }
+\.{DIGIT}+ { bc_char += strlen(yytext); yylval.num = bc_new(yytext); return NUMBER; }
+{DIGIT}+\. { bc_char += strlen(yytext); yylval.num = bc_new(yytext); return NUMBER; }
+{DIGIT}+\.{DIGIT}+ { bc_char += strlen(yytext); yylval.num = bc_new(yytext); return NUMBER; }
+
+"*" { bc_char += strlen(yytext); yylval.op = MUL; return MUL_OP; }
+"%" { bc_char += strlen(yytext); yylval.op = MOD; return MUL_OP; }
+"\/" { bc_char += strlen(yytext); yylval.op = DIV; return MUL_OP; }
+
+"+" { bc_char += strlen(yytext); yylval.op = ADD; return ADD_OP; }
+"-" { bc_char += strlen(yytext); yylval.op = SUB; return SUB_OP; }
+"^" { bc_char += strlen(yytext); yylval.op = POW; return POW_OP; }
+
+"=" { bc_char += strlen(yytext); yylval.op = SET; return ASSIGN_OP; }
+"+=" { bc_char += strlen(yytext); yylval.op = SADD; return ASSIGN_OP; }
+"-=" { bc_char += strlen(yytext); yylval.op = SSUB; return ASSIGN_OP; }
+"*=" { bc_char += strlen(yytext); yylval.op = SMUL; return ASSIGN_OP; }
+"\/=" { bc_char += strlen(yytext); yylval.op = SDIV; return ASSIGN_OP; }
+"%=" { bc_char += strlen(yytext); yylval.op = SMOD; return ASSIGN_OP; }
+"^=" { bc_char += strlen(yytext); yylval.op = SPOW; return ASSIGN_OP; }
+
+"==" { bc_char += strlen(yytext); yylval.op = EQ; return REL_OP; }
+"<=" { bc_char += strlen(yytext); yylval.op = LE; return REL_OP; }
+">=" { bc_char += strlen(yytext); yylval.op = GE; return REL_OP; }
+"!=" { bc_char += strlen(yytext); yylval.op = NE; return REL_OP; }
+"<" { bc_char += strlen(yytext); yylval.op = LT; return REL_OP; }
+">" { bc_char += strlen(yytext); yylval.op = GT; return REL_OP; }
+
+"++" { bc_char += strlen(yytext); yylval.op = INC; return INCR_DECR; }
+"--" { bc_char += strlen(yytext); yylval.op = DEC; return INCR_DECR; }
+
+"define" { bc_char += strlen(yytext); return Define; }
+"break" { bc_char += strlen(yytext); return Break; }
+"quit" { bc_char += strlen(yytext); return Quit; }
+"length" { bc_char += strlen(yytext); return Length; }
+"return" { bc_char += strlen(yytext); return Return; }
+"for" { bc_char += strlen(yytext); return For; }
+"if" { bc_char += strlen(yytext); return If; }
+"while" { bc_char += strlen(yytext); return While; }
+"sqrt" { bc_char += strlen(yytext); return Sqrt; }
+"scale" { bc_char += strlen(yytext); return Scale; }
+"ibase" { bc_char += strlen(yytext); return Ibase; }
+"obase" { bc_char += strlen(yytext); return Obase; }
+"auto" { bc_char += strlen(yytext); return Auto; }
+
+"\n" { bc_lineno++; bc_char = 1; return NEWLINE; }
+
+\(|\)|\[|\]|;|, { bc_char++; return yytext[0]; }
+
+{LETTER} { bc_char++; yylval.c = yytext[0]; return LETTER; }
+
+{WHITESPACE} { bc_char++; }
+. { bc_char++; }