Fix brainf*ck interpreter memory issue
[bob_language.git] / lexer.lex
blobedc7780210c7f00b8b389f3ebd4b1f0e682774fa
1 %{
3 #include <string.h>
4 #include <stdio.h>
5 #include "dynstrings.h"
6 #include "core.h"
7 #include "parser.h"
9 int yycolumn = 1;
11 void set_yylloc() {
12         yylloc.first_line = yylloc.last_line = yylineno;
13         yylloc.first_column = yycolumn;
14         yylloc.last_column = yycolumn + yyleng - 1;
15         yycolumn += yyleng;
18 #define YY_USER_ACTION set_yylloc();
22 %option yylineno
24 DECNUM     [0-9]+
25 HEXNUM     "0x"+[0-9A-Fa-f]+
26 STRNUM     \"[^\"\n]+\"
27 ID         [a-zA-Z][0-9A-Za-z_]*
28 PARS       "("|")"|"{"|"}"|"["|"]"
29 OPERATOR   "+"|"-"|"*"|"/"|"%"|"&"|"|"|"^"|"!"|">>"|"<<"|"<"|">"|"=="|"$"|"="|","
30 COMMENT    "#".*$
34 fn {
35   return FN;
37 \? {
38   yylval.node = node_new();
39   yylval.node->id = NODE_IF;
40   return IF;
42 \?\? {
43   yylval.node = node_new();
44   yylval.node->id = NODE_WHILE;
45   return WHILE;
47 re {
48   yylval.node = node_new();
49   yylval.node->id = NODE_RETURN;
50   return RETURN;
52 TRUE {
53   yylval.node = node_new();
54   yylval.node->id = NODE_PUSH_BOOL;
55   node_set(yylval.node, strdup("True"));
56   return TRUE;
58 FALSE {
59   yylval.node = node_new();
60   yylval.node->id = NODE_PUSH_BOOL;
61   node_set(yylval.node, strdup("False"));
62   return FALSE;
64 {DECNUM} {
65   yylval.node = node_new();
66   yylval.node->id = NODE_PUSH_DEC;
67   node_set(yylval.node, strdup(yytext));
68   return DECNUM;
70 {HEXNUM} {
71   yylval.node = node_new();
72   yylval.node->id = NODE_PUSH_HEX;
73   node_set(yylval.node, strdup(yytext));
74   return HEXNUM;
76 {STRNUM} {
77   yylval.node = node_new();
78   yylval.node->id = NODE_PUSH_STR;
79   node_set(yylval.node, strdup(yytext));
80   return STRNUM;
82 {ID} {
83   yylval.node = node_new();
84   yylval.node->id = NODE_PUSH_VAR;
85   node_set(yylval.node, strdup(yytext));
86   return ID;
88 {PARS} {
89   return yytext[0];
91 {OPERATOR} {
92   if (strcmp(yytext, "<<") == 0) return SHL;
93   if (strcmp(yytext, ">>") == 0) return SHR;
94   if (strcmp(yytext, "==") == 0) return EQU;
95   return yytext[0];
97 [ \t] ;
98 {COMMENT} ;
99 \n {
100   yycolumn = 1;
101   return NEWLINE;
103 . {
104   core_error(str_printf("Error: [Line %d] Illegal character! (\"%s\")\n", yylineno, yytext));