work on type inference some more
[ccc.git] / scan.l
1 D [0-9]
2 H [0-9a-fA-F]
3 E ([0\\abtnvfr]|x{H}?{H}|0[0-3]?{O}?{O})
4 I [a-zA-Z_]
5 O [0-7]
6
7 %option noinput
8 %option nounput
9 %{
10
11 #include <stdio.h>
12 #define YY_USER_ACTION \
13 yylloc.first_line = yylloc.last_line; \
14 yylloc.first_column = yylloc.last_column; \
15 for(int i = 0; yytext[i] != '\0'; i++) { \
16 if(yytext[i] == '\n') { \
17 yylloc.last_line++; \
18 yylloc.last_column = 0; \
19 } \
20 else { \
21 yylloc.last_column++; \
22 } \
23 }
24
25 #include "ast.h"
26 #include "parse.h"
27
28 %}
29
30 %start IN_COMMENT
31
32 %%
33
34 <INITIAL>{
35 \/\* BEGIN(IN_COMMENT);
36 [ \n\t] ;
37 \/\/.*\n? ;
38 if return IF;
39 else return ELSE;
40 while return WHILE;
41 var return VAR;
42 true { yylval.expr = expr_bool(true); return BOOL; }
43 false { yylval.expr = expr_bool(false); return BOOL; }
44 return return RETURN;
45 Int return TINT;
46 Bool return TBOOL;
47 Char return TCHAR;
48 Void return TVOID;
49 -> return ARROW;
50 = return ASSIGN;
51 ! return INVERSE;
52 \|\| return BINOR;
53 && return BINAND;
54 == return EQ;
55 != return NEQ;
56 \<= return GEQ;
57 \< return GE;
58 >= return LEQ;
59 > return LE;
60 : return CONS;
61 \+ return PLUS;
62 - return MINUS;
63 \* return TIMES;
64 \/ return DIVIDE;
65 % return MODULO;
66 \^ return POWER;
67 \( return BOPEN;
68 \) return BCLOSE;
69 \{ return COPEN;
70 \} return CCLOSE;
71 \; return SEMICOLON;
72 \[ return SOPEN;
73 \] return SCLOSE;
74 \[\] return NIL;
75 \. return DOT;
76 , return COMMA;
77 \"([^\\"]|\\(\"|{E}))*\" {
78 yylval.expr = expr_string(trimquotes(yytext)); return STRING; }
79 '([^\\']|\\('|{E}))' {
80 yylval.expr = expr_char(trimquotes(yytext)); return CHAR; }
81 {D}+ {
82 yylval.expr = expr_int(atoi(yytext)); return INTEGER; }
83 {I}({I}|{D})* {
84 yylval.ident = safe_strdup(yytext); return IDENT; }
85 }
86 <IN_COMMENT>{
87 \*\/ BEGIN(INITIAL);
88 . ;
89 }
90
91 %%