daily pastebin goal
29%
SHARE
TWEET

Untitled

a guest Jan 23rd, 2019 61 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. %{
  2. #include <stdio.h> /* printf() */
  3. #include <string.h> /* strcpy */
  4. #include <stdlib.h> /* atoi(), atof() */
  5. #include "common.h" /* MAX_STR_LEN */
  6. #include "c.tab.h" /* deklaracja symboli końcowych */
  7.  
  8. /* wypisanie informacji o znalezionym symbolu końcowym */
  9. int process_token(const char *text, const char *TokenType,
  10.                   const char *TokenVal, const int TokenID);
  11.  
  12. int comm_beg = 0; /* wiersz rozpoczęcia komentarza */
  13. %}
  14.  
  15. /* deklaracja warunków początkowych analizatora */
  16. /* (nie deklarujemy domyślnego warunku INITIAL) */
  17. /* ..................... */
  18.  
  19. %x STRING
  20. %x COMMENT
  21. %option yylineno
  22.  
  23.  
  24. %%
  25.  /* tu należy umieścić odpowiednie reguły w odpowiedniej kolejności */
  26.  
  27.  /* B: Slowa kluczowe */
  28. char return process_token(yytext, "KW_CHAR", "", KW_CHAR);
  29. unsigned return process_token(yytext, "KW_UNSIGNED", "", KW_UNSIGNED);
  30. short return process_token(yytext, "KW_SHORT", "", KW_SHORT);
  31. int return process_token(yytext, "KW_INT", "", KW_INT);
  32. long return process_token(yytext, "KW_LONG", "", KW_LONG);
  33. float return process_token(yytext, "KW_FLOAT", "", KW_FLOAT);
  34. void return process_token(yytext, "KW_VOID", "", KW_VOID);
  35. for return process_token(yytext, "KW_FOR", "", KW_FOR);
  36. double return process_token(yytext, "KW_DOUBLE", "", KW_DOUBLE);
  37. if return process_token(yytext, "KW_IF", "", KW_IF);
  38. else return process_token(yytext, "KW_ELSE", "", KW_ELSE);
  39. while return process_token(yytext, "KW_WHILE", "", KW_WHILE);
  40. do return process_token(yytext, "KW_DO", "", KW_DO);
  41. struct return process_token(yytext, "KW_STRUCT", "", KW_STRUCT);
  42.  
  43.  /* C: Biale znaki */
  44. [ \n\t]+
  45.  
  46.  /* D */
  47. "//".*$
  48.  
  49.  /* E */
  50. "++" return process_token(yytext, "INC", "", INC);
  51. "<=" return process_token(yytext, "LE", "", LE);
  52.  
  53.  /* F: Identyfikatory */
  54. [A-Za-z_][A-Za-z0-9_]* return process_token(yytext, "IDENT", yytext, IDENT);
  55.  
  56.  /* G: Liczby Calkowite */
  57. [0-9]+ return process_token(yytext, "INTEGER_CONST", yytext, INTEGER_CONST);
  58.  /* G: Zmiennoprzecinkowe */
  59. (([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+))([eE](\+|-)?[0-9]{1,2})? return process_token(yytext, "FLOAT_CONST", yytext, FLOAT_CONST);
  60.  
  61.  
  62.  /* I: stale znakowe */
  63. '[^'\n]{1,2}' return process_token(yytext, "CHARACTER_CONST", yytext, CHARACTER_CONST);
  64.  
  65.  /* J wykrywanie symboli końcowych jednoznakowych */
  66. [;{},=\[\]()\+\-\*/<>\?\:\.] return process_token(yytext, yytext, "", *yytext);
  67.  
  68.  
  69.  
  70.  
  71.  /* Podpunkty K - O */
  72.  /* K Dyrektywy */
  73. ^#include.*$ return process_token("Przetwarzenie", yytext, "", IDENT);
  74. ^#define.*$ return process_token("Przetwarzenie", yytext, "", IDENT);
  75.  
  76.  /* L Napisy warunki poczatkowe */
  77. <INITIAL>\" { BEGIN(STRING); yymore(); }
  78. <STRING>\" { BEGIN(INITIAL); return process_token(yytext, "STRING_CONST", yytext, STRING_CONST); }
  79. <STRING>. yymore();
  80. <STRING>\n { printf("Niezamkniety napis otwarty w wierszu %d\n", yylineno - 1); BEGIN(INITIAL); }
  81.  
  82.  /* Komentarze (na warunkach poczatkowych M, N, O */
  83. <INITIAL>"/*" { yymore(); BEGIN(COMMENT); comm_beg = yylineno; }
  84. <COMMENT>.|\n { yymore(); }
  85. <COMMENT>"*/" { BEGIN(INITIAL); }
  86. <INITIAL>"*/" { printf("Nieoczekiwane zamkniecie komentarza w wierszu %d\n", yylineno); }
  87.  
  88. %%
  89.  
  90. /* Nazwa:       process_token
  91.  * Cel:         Wypisanie informacji o wykrytym elemencie i przekazanie
  92.  *              tej informacji wyżej z ewentualną wartością elementu, jeśli
  93.  *              takowa występuje.
  94.  * Parametry:   text            - (i) tekst, do którego nastąpiło dopasowanie;
  95.  *              TokenType       - (i) napis będący tekstową reprezentacją
  96.  *                                      nazwy typu elementu;
  97.  *              TokenVal        - (i) wartość elementu, o ile występuje;
  98.  *              TokenID         - (i) identyfikator typu elementu zadeklarowany
  99.  *                                      za pomocą dyrektywy %token
  100.  *                                      w pliku c.y lub kod pojedynczego
  101.  *                  znaku (w pliku analizatora składniowego
  102.  *                  występuje ujęty w apostrofy).
  103.  * Zwraca:      Identyfikator typu elementu (TokenID).
  104.  * Uwagi:       Informacja o wykrytym elemencie zwracana jest
  105.  *              w trzech kolumnach. W pierwszej wypisywany jest tekst,
  106.  *              do którego nastąpiło dopasowanie, w drugiej - typ elementu,
  107.  *              w trzeciej - wartość elementu (o ile występuje).
  108.  */
  109. int process_token(const char *text, const char *TokenType,
  110.                   const char *TokenVal, const int TokenID)
  111. {
  112.   int l;
  113.   printf("%-20.20s%-15s %s\n", text, TokenType, TokenVal);
  114.   switch (TokenID) {
  115.  
  116.   case INTEGER_CONST:
  117.     yylval.i = atoi(text); break;
  118.  
  119.   case FLOAT_CONST:
  120.     yylval.d = atof(text); break;
  121.  
  122.   case IDENT:
  123.     strncpy(yylval.s, text, MAX_STR_LEN); break;
  124.  
  125.   case STRING_CONST:
  126.     l = strlen(TokenVal);
  127.     strncpy(yylval.s, TokenVal + 1, l - 2 <= MAX_STR_LEN ? l - 1 : MAX_STR_LEN);
  128.     break;
  129.  
  130.   case CHARACTER_CONST:
  131.     yylval.i = text[1]; break;
  132.  
  133.   }
  134.   return(TokenID);
  135. }
  136.  
  137.  
  138. int yywrap( void )
  139. { /* funkcja wywoływana po napotkaniu końca strumienia wejściowego
  140.  
  141.   /* sprawdzenie, czy warunek poczatkowy YY_START różni się od INITIAL. */
  142.   /* Jeżeli tak, to oznacza to niezamknięty komentarz lub stała tekstową
  143.      - wypisujemy informację o błędzie. */
  144.   /* ..................... */
  145.   if(YYSTATE == COMMENT)
  146.     printf("Brak zamkniecia komentarza otwartego w wierszu %d\n", comm_beg);
  147.   return( 1 ); /* koniecznie, by analiza nie rozpoczęła się od nowa */
  148. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top