8b1f859dfb2e4e41ecedbf7d66723056da012e03
[uebersetzerbau-ss10.git] / parser / scanner.lex
1         #include <stdio.h>
2         #include <stdlib.h>
3         #include <string.h>
4         #include "parser.h"
5
6 KEYWORD func|end|struct|var|if|then|else|while|do|return|or|not
7 SPECIAL_CHAR \;|\.|\(|\)|\,|\:=|\-|\+|\*|>=|=
8 IDENTIFIER [[:alpha:]_][[:alnum:]_]*
9 NUMBER_HEX [0-9][0-9A-Fa-f]*H
10 NUMBER_DEC [0-9]+
11 WHITESPACE [\t\n\r ]
12 COMMENT_START \(\*
13 COMMENT_END \*\)
14
15 %x COMMENT
16 %option yylineno
17 %%
18
19 {COMMENT_START} BEGIN(COMMENT);
20
21 <COMMENT>{COMMENT_END} BEGIN(INITIAL);
22
23 <COMMENT>{COMMENT_START} fprintf(stderr, "Possibly nested comment on line %i\n", yylineno);
24
25 <COMMENT><<EOF>> {
26         fprintf(stderr, "Unterminated comment.\n");
27         exit(1);
28 }
29
30 <COMMENT>{WHITESPACE} /* ignore */
31
32 <COMMENT>. /* ignore everything inside comment */
33
34 func return(FUNC);
35 end return(END);
36 struct return(STRUCT);
37 var return(VAR);
38 if return(IF);
39 then return(THEN);
40 else return(ELSE);
41 while return(WHILE);
42 do return(DO);
43 return return(RETURN);
44 or return(OR);
45 not return(NOT);
46
47 {IDENTIFIER} return(ID);
48
49 {NUMBER_DEC} return(NUM);
50 {NUMBER_HEX} return(NUM);
51
52 \:= return(ASSIGN);
53 >= return(GREATER);
54 {SPECIAL_CHAR} return(yytext[0]);
55
56 {WHITESPACE} /* ignore */
57
58 . {
59                 fprintf(stderr, "Lexical error on line %i\n", yylineno);
60                 exit(1);
61 }
62
63 %%
64