parser: makefile ... (und rest von paulchen ss08 kopiert)
[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>>                { fprintf(stderr, "Unterminated comment.\n"); exit(1); }
26
27 <COMMENT>{WHITESPACE}           /* ignore */
28
29 <COMMENT>.                      /* ignore everything inside comment */
30
31 func                            return(FUNC);
32 end                             return(END);
33 struct                          return(STRUCT);
34 var                             return(VAR);
35 if                              return(IF);
36 then                            return(THEN);
37 else                            return(ELSE);
38 while                           return(WHILE);
39 do                              return(DO);
40 return                          return(RETURN);
41 or                              return(OR);
42 not                             return(NOT);
43
44 {IDENTIFIER}                    return(ID);
45
46 {NUMBER_DEC}                    return(NUM);
47 {NUMBER_HEX}                    return(NUM);
48                                 
49 \:=                             return(ASSIGN);
50 >=                              return(GREATER);
51 {SPECIAL_CHAR}                  return(yytext[0]);
52
53 {WHITESPACE}                    /* ignore */
54
55 .                               { fprintf(stderr, "Lexical error on line %i\n", yylineno); exit(1); }
56
57 %%
58
59