work on type inference some more
[ccc.git] / scan.l
diff --git a/scan.l b/scan.l
index 048d104..664868c 100644 (file)
--- a/scan.l
+++ b/scan.l
@@ -1,16 +1,40 @@
+D [0-9]
+H [0-9a-fA-F]
+E ([0\\abtnvfr]|x{H}?{H}|0[0-3]?{O}?{O})
+I [a-zA-Z_]
+O [0-7]
+
 %option noinput
 %option nounput
 %{
 
 #include <stdio.h>
+#define YY_USER_ACTION \
+    yylloc.first_line = yylloc.last_line; \
+    yylloc.first_column = yylloc.last_column; \
+    for(int i = 0; yytext[i] != '\0'; i++) { \
+        if(yytext[i] == '\n') { \
+            yylloc.last_line++; \
+            yylloc.last_column = 0; \
+        } \
+        else { \
+            yylloc.last_column++; \
+        } \
+    }
+
 #include "ast.h"
-#include "y.tab.h"
-extern YYSTYPE yylval;
+#include "parse.h"
 
 %}
 
+%start IN_COMMENT
+
 %%
 
+<INITIAL>{
+\/\*        BEGIN(IN_COMMENT);
+[ \n\t]     ;
+\/\/.*\n?   ;
 if          return IF;
 else        return ELSE;
 while       return WHILE;
@@ -18,6 +42,11 @@ var         return VAR;
 true        { yylval.expr = expr_bool(true); return BOOL; }
 false       { yylval.expr = expr_bool(false); return BOOL; }
 return      return RETURN;
+Int         return TINT;
+Bool        return TBOOL;
+Char        return TCHAR;
+Void        return TVOID;
+->          return ARROW;
 =           return ASSIGN;
 !           return INVERSE;
 \|\|        return BINOR;
@@ -40,15 +69,23 @@ return      return RETURN;
 \{          return COPEN;
 \}          return CCLOSE;
 \;          return SEMICOLON;
+\[          return SOPEN;
+\]          return SCLOSE;
 \[\]        return NIL;
 \.          return DOT;
 ,           return COMMA;
-'([^']|\\[abtnvfr]|\\x[0-9a-fA-F]{2})' {
-       yylval.expr = expr_char(yytext); return CHAR; }
-[0-9]+ {
+\"([^\\"]|\\(\"|{E}))*\" {
+       yylval.expr = expr_string(trimquotes(yytext)); return STRING; }
+'([^\\']|\\('|{E}))' {
+       yylval.expr = expr_char(trimquotes(yytext)); return CHAR; }
+{D}+ {
        yylval.expr = expr_int(atoi(yytext)); return INTEGER; }
-[_a-zA-Z][_a-zA-Z0-9]* {
+{I}({I}|{D})* {
        yylval.ident = safe_strdup(yytext); return IDENT; }
-[ \n\t]  ;
+}
+<IN_COMMENT>{
+\*\/       BEGIN(INITIAL);
+.          ;
+}
 
 %%