From: Bernhard Urban Date: Wed, 3 Mar 2010 19:33:58 +0000 (+0100) Subject: scanner: erster versuch (ohne tests) X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=0ef2fa0d6a93470b207dd7723291e5bd581f8d19;hp=11a2bc3f8da629811e1cbb565a2a5df28782a43a;p=uebersetzerbau-ss10.git scanner: erster versuch (ohne tests) --- diff --git a/.gitignore b/.gitignore index 1fc9142..f68ecb8 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,8 @@ asma/asma #asmb asmb/asmb +#scanner +scanner/scanner.c +scanner/scanner + #weitere eintragen... diff --git a/scanner/Makefile b/scanner/Makefile new file mode 100755 index 0000000..7efaed8 --- /dev/null +++ b/scanner/Makefile @@ -0,0 +1,20 @@ +NAME := scanner +all: $(NAME) + +$(NAME): $(NAME).lex + @echo " FLEX $<" + @flex -o$(NAME).c $(NAME).lex + @echo " COMPILE $<" + @gcc -pedantic -ansi -Wall -g -o $(NAME) $(NAME).c -D_GNU_SOURCE -lfl + +.PHONY: clean +clean: + rm -f $(NAME).o $(NAME) $(NAME).c + +1test: $(NAME) + @echo "execute ./$(NAME)" + @./$(NAME) + +2test: + /usr/ftp/pub/ublu/test/$(NAME)/test + diff --git a/scanner/scanner.lex b/scanner/scanner.lex new file mode 100644 index 0000000..ebf5f8f --- /dev/null +++ b/scanner/scanner.lex @@ -0,0 +1,53 @@ + #include + #include + #include + +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 ist unsere zustandsvariable! */ +%x COMMENT +%option yylineno +%% + +{COMMENT_START} BEGIN(COMMENT); + +{COMMENT_END} BEGIN(INITIAL); + +<> { (void) fprintf(stderr, "kommentar nicht geschlossen\n"); exit(1); } + +. /* alles im kommentar wird ignoriert */ + +{KEYWORD} printf("%s\n", yytext); + +{SPECIAL_CHAR} printf("%s\n", yytext); + +{IDENTIFIER} printf("ident %s\n", yytext); + +{NUMBER_DEC} printf("num %x\n", strtol(yytext, (char **)NULL, 10)); + +{NUMBER_HEX} { +#if 0 + char *copy=strdup(yytext); + copy[strlen(copy)-1]='\0'; +#endif + printf("num %x\n", strtol(yytext, (char **)NULL, 16)); +} + +{WHITESPACE} /* ignorieren */ + +. { (void) fprintf(stderr, "Lexikalischer fehler auf Zeile %i\n", yylineno); exit(1); } + +%% + +int main(int argc, char **argv) { + yylex(); + return 0; +} +