Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %{
- /****************************************************************************
- lexer.l
- ParserWizard generated Lex file.
- Author: Dominika Sokołowska
- Date: 9 października 2009
- hasło do wykładu SzwochKompilatory2013
- ****************************************************************************/
- #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 comm_beg = 0; /* wiersz rozpoczęcia komentarza */
- %}
- /***************************************************************************/
- /* declarations section - place any declarations here */
- /***************************************************************************/
- /* deklaracja dodatkowych stanów skanera (nie deklarujemy domyślnego stanu INITIAL */
- /* ..................... */
- /* 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 */
- /***************************************************************************/
- /* eliminacja komentarzy wielowierszowych z wykorzystaniem mechanizmu stanów */
- "/*".*"*/"
- /* eliminacja komentarzy jednowierszowych z wykorzystaniem mechanizmu stanów */
- "//".*
- /* wykrycie błędu: Nieoczekiwane zamknięcie komentarza w wierszu */
- /* ..................... */
- /* wykrywanie stałych tekstowych ".." z wykorzystaniem mechanizmu stanów */
- /* ..................... */
- /* wykrycie dyrektyw postaci #include <name.exe> oraz #include "name.exe" */
- /* z wykorzystaniem mechanizmu stanów */
- "#include ".*$ {printf("przetwarzanie dyrektywy %s \n", yytext);}
- /* wykrycie słów kluczowych */
- /* ..................... */
- "int " {return process_token("KW_INT", "int", KW_INT);}
- "char " {return process_token("KW_CHAR", "char", KW_CHAR);}
- "void " {return process_token("KW_VOID", "void", KW_VOID);}
- "for " {return process_token("KW_FOR", "for", KW_FOR);}
- "unsigned " {return process_token("KW_UNSIGNED", "unsigned", KW_UNSIGNED);}
- "double " {return process_token("KW_DOUBLE", "double", KW_DOUBLE);}
- /* wykrycie tokenów opisywanych złożonymi wyrażeniami regularnymi */
- {num}+ { return process_token("INT_NUMBER", yytext, INT_NUMBER); }
- ({num}+\.{num}+)|({num}+\.)|(\.{num}+) { return process_token("FLOAT_NUMBER", yytext, FLOAT_NUMBER); }
- {alphanum2}+ { return process_token("IDENT", yytext, IDENT); }
- /* wycięcie białych znaków */
- [ \t\r]
- /* operatory wieloznakowe np.: ++ */
- /* ..................... */
- "++" {return process_token("INC", yytext, INC);}
- "<=" {return process_token("LE", yytext, LE);}
- /* operatory jednoznakowe oraz interpunkcja */
- ^alphanum2 {return process_token(yytext, yytext, yytext[0]);}
- %%
- /***************************************************************************/
- /* programs section */
- /***************************************************************************/
- int process_token( char *TokenType, char *TokenVal, int TokenID )
- { /* wypisanie informacji o znalezionym tokenie:
- - TokenType - określenie 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 wejściowego
- /* 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.*/
- /* ..................... */
- return( 1 ); /* koniecznie, by analiza nie rozpoczęła się od nowa */
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement