--- /dev/null
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+ #include "parser.h"
+ #include "tree.h"
+
+KEYWORD func|end|struct|var|if|then|else|while|do|return|or|not
+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); @{ @ID.name@=strdup(yytext); @}
+
+{NUMBER_DEC} return(NUM); @{ @NUM.value@=strtol(yytext,(char **)NULL,10); @}
+{NUMBER_HEX} return(NUM); @{ yytext[strlen(yytext)-1]='\0'; @NUM.value@=strtol(yytext,(char **)NULL,16); @}
+
+\:= return(ASSIGN);
+>= return(GREATER);
+\; return(';');
+\. return('.');
+\( return('(');
+\) return(')');
+\, return(',');
+\- return('-');
+\+ return('+');
+\* return('*');
+= return('=');
+
+{WHITESPACE} /* ignore */
+
+. { fprintf(stderr, "Lexical error on line %i\n", yylineno); exit(1); }
+
+%%
+
+