work on type inference some more
[ccc.git] / scan.l
diff --git a/scan.l b/scan.l
index b1fb5be..664868c 100644 (file)
--- a/scan.l
+++ b/scan.l
@@ -1,3 +1,9 @@
+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 "ast.h"
-#include "y.tab.h"
+#include "parse.h"
 
 %}
 
+%start IN_COMMENT
+
 %%
 
+<INITIAL>{
+\/\*        BEGIN(IN_COMMENT);
+[ \n\t]     ;
+\/\/.*\n?   ;
 if          return IF;
 else        return ELSE;
 while       return WHILE;
@@ -30,6 +42,10 @@ 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;
@@ -58,12 +74,18 @@ return      return RETURN;
 \[\]        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);
+.          ;
+}
 
 %%