Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %{
- /****************************************************************************
- lexer.l
- ParserWizard generated Lex file.
- Author: Tobiasz Biernacki
- Date: 28 padziernika 2013
- ****************************************************************************/
- #include <stdio.h> /* printf() */
- #include <string.h> /* strcpy */
- #include <stdlib.h> /* atoi(), atof() */
- #include "common.h" /* MAX_STR_LEN */
- #ifdef PG
- #include "parser.h" /* deklaracja tokenów */
- #else
- #include "parser.tab.h" /* deklaracja tokenów */
- #endif
- /* wypisanie informacji o znalezionym tokenie */
- int process_token( char *TokenType, char *TokenVal, int TokenID );
- int lines=0;
- int comm_beg = 0; /* wiersz rozpoczêcia komentarza */
- %}
- /***************************************************************************/
- /* declarations section - place any declarations here */
- /***************************************************************************/
- /* deklaracja dodatkowych stanów skanera (nie deklarujemy domylnego stanu INITIAL */
- %s otwartykomentarz otwartystring
- /* pomocnicze wyra¿enia regularne */
- alpha [a-zA-Z]
- num [0-9]
- alphanum [a-zA-Z0-9]
- alphanum2 [a-zA-Z0-9_]
- %%
- /***************************************************************************/
- /* rules section - place your Lex rules here */
- /***************************************************************************/
- \n { lines++; }
- /* eliminacja komentarzy wielowierszowych z wykorzystaniem mechanizmu stanów */
- <INITIAL>\/\*.*\*\/ ;
- <INITIAL>\/\* { BEGIN otwartykomentarz; }
- /* eliminacja komentarzy jednowierszowych z wykorzystaniem mechanizmu stanów */
- [//].* ;
- /* wykrycie b³êdu: Nieoczekiwane zamkniêcie komentarza w wierszu */
- <INITIAL>\*\/ { printf("ERROR: niespodziewany koniec komentarza w lini %d\n", lines+1); }
- /* wykrywanie sta³ych tekstowych ".." z wykorzystaniem mechanizmu stanów */
- <INITIAL>\".*\" { return process_token("TEXT_CONST",yytext,TEXT_CONST); }
- <INITIAL>\" { BEGIN otwartystring; }
- /* wykrycie dyrektyw postaci #include <name.exe> oraz #include "name.exe" */
- /* z wykorzystaniem mechanizmu stanów */
- "#include <"{alpha}+\.{alpha}+> { printf("Processing directive: %s\n", yytext); }
- "#include "\"{alpha}+\.{alpha}+\" { printf("Processing directive: %s\n", yytext); }
- /* wykrycie s³ów kluczowych */
- "char" { return process_token("KW_CHAR","",KW_CHAR); }
- "unsigned" { return process_token("KW_UNSIGNED","",KW_UNSIGNED); }
- "int" { return process_token("KW_INT","",KW_INT); }
- "void" { return process_token("KW_VOID","",KW_VOID); }
- "for" { return process_token("KW_FOR","",KW_FOR); }
- "double" { return process_token("KW_DOUBLE","",KW_DOUBLE); }
- /* wykrycie tokenów opisywanych z³o¿onymi wyra¿eniami regularnymi */
- {alpha}+{alphanum2}* { return process_token("IDENT",yytext,IDENT); }
- {num}+ { return process_token("INT_NUMBER",yytext,INT_NUMBER); }
- ({num}+[.]{num}*)|({num}*[.]{num}+) { return process_token("FLOAT_NUMBER","",FLOAT_NUMBER); }
- \'{alpha}\' { return process_token("CHAR",yytext,CHAR); }
- /* wyciêcie bia³ych znaków */
- [ \t\r] ;
- /* operatory wieloznakowe np.: ++ */
- "++" { return process_token("INC","",INC); }
- "<=" { return process_token("LE","",LE); }
- /* operatory jednoznakowe oraz interpunkcja */
- . { char buf[3]; sprintf(buf,"%d",yytext[0]); return process_token(buf,"",yytext[0]); }
- %%
- /***************************************************************************/
- /* programs section */
- /***************************************************************************/
- int process_token( char *TokenType, char *TokenVal, int TokenID )
- { /* wypisanie informacji o znalezionym tokenie:
- - TokenType - okrelenie typu tokena, np. "Litera³"
- - TokenValue - wartoæ tokena znakowo, np. "123"
- - TokenID - ID tokena zdefiniowane jako token w pliku parser.y lub kod ASCII dla tokenów jednoznakowych*/
- printf( "%-20.20s%-15s %s\n", yytext, TokenType, TokenVal );
- return( TokenID ); /* zwrócenie kodu tokena */
- }
- int yywrap( void )
- { /* funkcja wywo³ywana po napotkaniu koñca strumienia wejciowego
- /* sprawdzenie, czy stan automatu YYSTATE ró¿ni siê od stanu pocz¹tkowego. Je¿eli tak,
- to oznacza to niezamkniêty komentarz lub sta³¹ tekstow¹ - wypisujemy informacjê o b³êdzie.*/
- if( YYSTATE == otwartykomentarz )
- printf( "Niezamkniety komentarz\n" );
- if( YYSTATE == otwartystring )
- printf( "Niezamkniety string\n" );
- return( 1 ); /* koniecznie, by analiza nie rozpoczê³a siê od nowa */
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement