parser: makefile ... (und rest von paulchen ss08 kopiert)
[uebersetzerbau-ss10.git] / parser / scanner.lex
diff --git a/parser/scanner.lex b/parser/scanner.lex
new file mode 100644 (file)
index 0000000..043db06
--- /dev/null
@@ -0,0 +1,59 @@
+       #include <stdio.h>
+       #include <stdlib.h>
+       #include <string.h>
+       #include "parser.h"
+
+KEYWORD                func|end|struct|var|if|then|else|while|do|return|or|not
+SPECIAL_CHAR   \;|\.|\(|\)|\,|\:=|\-|\+|\*|>=|=
+IDENTIFIER     [[:alpha:]_][[:alnum:]_]*
+NUMBER_HEX     [0-9][0-9A-Fa-f]*H
+NUMBER_DEC     [0-9]+
+WHITESPACE     [\t\n\r ]
+COMMENT_START  \(\*
+COMMENT_END    \*\)
+
+%x COMMENT
+%option yylineno
+%%
+
+{COMMENT_START}                        BEGIN(COMMENT);
+
+<COMMENT>{COMMENT_END}         BEGIN(INITIAL);
+
+<COMMENT>{COMMENT_START}       fprintf(stderr, "Possibly nested comment on line %i\n", yylineno);
+
+<COMMENT><<EOF>>               { fprintf(stderr, "Unterminated comment.\n"); exit(1); }
+
+<COMMENT>{WHITESPACE}          /* ignore */
+
+<COMMENT>.                     /* ignore everything inside comment */
+
+func                           return(FUNC);
+end                            return(END);
+struct                         return(STRUCT);
+var                            return(VAR);
+if                             return(IF);
+then                           return(THEN);
+else                           return(ELSE);
+while                          return(WHILE);
+do                             return(DO);
+return                         return(RETURN);
+or                             return(OR);
+not                            return(NOT);
+
+{IDENTIFIER}                   return(ID);
+
+{NUMBER_DEC}                   return(NUM);
+{NUMBER_HEX}                   return(NUM);
+                               
+\:=                            return(ASSIGN);
+>=                             return(GREATER);
+{SPECIAL_CHAR}                 return(yytext[0]);
+
+{WHITESPACE}                   /* ignore */
+
+.                              { fprintf(stderr, "Lexical error on line %i\n", yylineno); exit(1); }
+
+%%
+
+