Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2019
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.38 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement