Advertisement
desdemona

c

Oct 29th, 2013
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.21 KB | None | 0 0
  1. %{
  2. /****************************************************************************
  3. lexer.l
  4. ParserWizard generated Lex file.
  5. Author: Dominika Sokołowska
  6. Date: 9 października 2009
  7.  
  8. hasło do wykładu SzwochKompilatory2013
  9. ****************************************************************************/
  10.  
  11. #include <stdio.h> /* printf() */
  12. #include <string.h> /* strcpy */
  13. #include <stdlib.h> /* atoi(), atof() */
  14. #include "common.h" /* MAX_STR_LEN */
  15. #ifdef PG
  16. #include "parser.h" /* deklaracja tokenów */
  17. #else
  18. #include "parser.tab.h" /* deklaracja tokenów */
  19. #endif
  20.  
  21. /* wypisanie informacji o znalezionym tokenie */
  22. int process_token( char *TokenType, char *TokenVal, int TokenID );
  23.  
  24. int comm_beg = 0; /* wiersz rozpoczęcia komentarza */
  25. %}
  26.  
  27. /***************************************************************************/
  28. /*           declarations section - place any declarations here            */
  29. /***************************************************************************/
  30.  
  31. /* deklaracja dodatkowych stanów skanera (nie deklarujemy domyślnego stanu INITIAL */
  32. /* ..................... */
  33.  
  34. /* pomocnicze wyrażenia regularne */
  35. alpha       [a-zA-Z]
  36. num         [0-9]
  37. alphanum    [a-zA-Z0-9]
  38. alphanum2   [a-zA-Z0-9_]
  39.  
  40.  
  41. %%
  42.  
  43.  /***************************************************************************/
  44.  /*           rules section - place your Lex rules here                     */
  45.  /***************************************************************************/
  46.  
  47.  /* eliminacja komentarzy wielowierszowych z wykorzystaniem mechanizmu stanów */
  48. "/*".*"*/"
  49.  
  50.  /* eliminacja komentarzy jednowierszowych z wykorzystaniem mechanizmu stanów */
  51.  "//".*
  52.  
  53.  /* wykrycie błędu: Nieoczekiwane zamknięcie komentarza w wierszu */
  54.  /* ..................... */
  55.  
  56.  /* wykrywanie stałych tekstowych ".." z wykorzystaniem mechanizmu stanów */
  57.  /* ..................... */
  58.  
  59.  /* wykrycie dyrektyw postaci #include <name.exe> oraz #include "name.exe" */
  60.  /* z wykorzystaniem mechanizmu stanów */
  61. "#include ".*$ {printf("przetwarzanie dyrektywy %s \n", yytext);}
  62.  
  63.  
  64.  /* wykrycie słów kluczowych */
  65.  /* ..................... */
  66. "int "  {return process_token("KW_INT", "int", KW_INT);}
  67. "char " {return process_token("KW_CHAR", "char", KW_CHAR);}
  68. "void " {return process_token("KW_VOID", "void", KW_VOID);}
  69. "for "  {return process_token("KW_FOR", "for", KW_FOR);}
  70. "unsigned " {return process_token("KW_UNSIGNED", "unsigned", KW_UNSIGNED);}
  71. "double "   {return process_token("KW_DOUBLE", "double", KW_DOUBLE);}
  72.  
  73.  
  74.  /* wykrycie tokenów opisywanych złożonymi wyrażeniami regularnymi */
  75. {num}+ { return process_token("INT_NUMBER", yytext, INT_NUMBER);  }
  76. ({num}+\.{num}+)|({num}+\.)|(\.{num}+) { return process_token("FLOAT_NUMBER", yytext, FLOAT_NUMBER);  }
  77. {alphanum2}+ { return process_token("IDENT", yytext, IDENT);  }
  78.  
  79.  
  80.  
  81.  /* wycięcie białych znaków */
  82. [ \t\r]
  83.  
  84.  
  85.  /* operatory wieloznakowe np.: ++ */
  86.  /* ..................... */
  87. "++" {return process_token("INC", yytext, INC);}
  88. "<=" {return process_token("LE", yytext, LE);}
  89.  
  90.  
  91.  /* operatory jednoznakowe oraz interpunkcja */
  92. ^alphanum2 {return process_token(yytext, yytext, yytext[0]);}
  93.  
  94.  
  95. %%
  96.  
  97. /***************************************************************************/
  98. /*                         programs section                                */
  99. /***************************************************************************/
  100.  
  101. int process_token( char *TokenType, char *TokenVal, int TokenID )
  102. { /* wypisanie informacji o znalezionym tokenie:
  103.     - TokenType - określenie typu tokena, np. "Literał"
  104.     - TokenValue - wartość tokena znakowo, np. "123"
  105.     - TokenID - ID tokena zdefiniowane jako token w pliku parser.y lub kod ASCII dla tokenów jednoznakowych*/
  106.    
  107.     printf( "%-20.20s%-15s %s\n", yytext, TokenType, TokenVal );
  108.     return( TokenID ); /* zwrócenie kodu tokena */
  109. }
  110.  
  111. int yywrap( void )
  112. { /* funkcja wywoływana po napotkaniu końca strumienia wejściowego
  113.  
  114.     /* sprawdzenie, czy stan automatu YYSTATE różni się od stanu początkowego. Jeżeli tak,
  115.     to oznacza to niezamknięty komentarz lub stałą tekstową - wypisujemy informację o błędzie.*/
  116.     /* ..................... */
  117.  
  118.     return( 1 ); /* koniecznie, by analiza nie rozpoczęła się od nowa */
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement