blob: 3fdb7ae7b33ae9831587e5f0cb3621bf0589568f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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++; }
|