Advertisement
desdemona

KK LEXER.L

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