Tobiasz931

To je flex tego nie ogarniesz

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

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×