ag: parser.y und scanner.lex von parser/
[uebersetzerbau-ss10.git] / ag / scanner.lex
index f66b947cab8cd0b06705cc5dfc4d5752953732d7..049cdd2c1e54245ce7aad3a3f12b63dd65da5130 100644 (file)
@@ -3,65 +3,57 @@
        #include <string.h>
        #include "parser.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    \*\)
+KEYWORD struct|end|method|var|if|then|else|while|do|return|not|or|this
+SPECIAL_CHAR \;|\(|\)|\:=|\.|\-|\*|\<|\=|\,
+IDENTIFIER [a-zA-Z_][0-9a-zA-Z_]*
+NUMBER_HEX 0x[0-9A-Fa-f]+
+NUMBER_DEC [0-9]+
+WHITESPACE [\t\n\r ]
+COMMENT_START \/\*
+COMMENT_END    \*\/
 
 %x COMMENT
 %option yylineno
 %%
 
+{COMMENT_START} BEGIN(COMMENT);
 
-{COMMENT_START}                        BEGIN(COMMENT);
+<COMMENT>{COMMENT_END} BEGIN(INITIAL);
 
-<COMMENT>{COMMENT_END}         BEGIN(INITIAL);
+<COMMENT><<EOF>> {
+       fprintf(stderr, "Kommentar nicht geschlossen\n");
+       exit(1);
+}
 
-<COMMENT>{COMMENT_START}       fprintf(stderr, "Possibly nested comment on line %i\n", yylineno);
+<COMMENT>(.|\n) /* alles im kommentar wird ignoriert */
 
-<COMMENT><<EOF>>               { fprintf(stderr, "Unterminated comment.\n"); exit(1); }
+struct return(STRUCT);
+end return(END);
+method return(METHOD);
+var return(VAR);
+if return(IF);
+then return(THEN);
+else return(ELSE);
+while return(WHILE);
+do return(DO);
+return return(RETURN);
+not return(NOT);
+or return(OR);
+this return(THIS);
 
-<COMMENT>{WHITESPACE}          /* ignore */
+{IDENTIFIER} return(IDENT);
 
-<COMMENT>.                     /* ignore everything inside comment */
+{NUMBER_DEC} return(NUM);
+{NUMBER_HEX} return(NUM);
 
-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);
+{SPECIAL_CHAR} return(*yytext);
 
-{IDENTIFIER}                   return(ID); @{ @ID.name@=strdup(yytext); @}
+{WHITESPACE} /* ignore */
 
-{NUMBER_DEC}                   return(NUM);
-{NUMBER_HEX}                   return(NUM);
-                               
-\:=                            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); }
+. {
+               fprintf(stderr, "Lexical error on line %i\n", yylineno);
+               exit(1);
+}
 
 %%
 
-