Advertisement
Tobiasz931

To je flex tego nie ogarniesz

Oct 28th, 2013
2,352
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Unicon 4.60 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement