Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2014
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.31 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 "p.tab.h" /* deklaracja symboli końcowych */
  7.  
  8. int process_token(const char *text, const char *TokenType,
  9. const char *TokenVal, const int TokenID);
  10.  
  11. int comm_beg = 0; /* wiersz rozpoczęcia komentarza */
  12. %}
  13.  
  14.  
  15. /* deklaracja dodatkowych warunków początkowych analizatora leksykalnego */
  16. /* (nie deklarujemy domyślnego warunku początkowego INITIAL */
  17. /* ..................... */
  18. %x ST_COMMENT_1 ST_COMMENT_2 ST_TEXT_CONST
  19.  
  20. /* pomocnicze wyrażenia regularne */
  21. alpha [a-zA-Z]
  22. num [0-9]
  23. alphanum [a-zA-Z0-9]
  24. alphanum2 [a-zA-Z0-9_]
  25.  
  26.  
  27. %%
  28.  
  29.  
  30. /* usuwanie komentarzy wielowierszowych (*..*) */
  31. /* z wykorzystaniem mechanizmu warunków początkowych */
  32. /* ..................... */
  33.  
  34.  
  35. /* usuwanie komentarzy wielowierszowych {..} */
  36. /* z wykorzystaniem mechanizmu warunków początkowych */
  37. /* ..................... */
  38.  
  39.  
  40. /* wykrycie błędu: Nieoczekiwane zamknięcie komentarza w wierszu */
  41. /* ..................... */
  42.  
  43.  
  44. /* wykrywanie stałych tekstowych '..' */
  45. /* z wykorzystaniem mechanizmu warunków początkowych */
  46.  
  47. /*bez wykorzystania war. pocz.*/
  48. \'[^\'\n]*\' return process_token(yytext, "STRING_CONST", yytext, STRING_CONST);
  49.  
  50. /* wykrycie dyrektyw postaci {$I name.ext} */
  51. /* (bez wykorzystaniem mechanizmu warunków początkowych) */
  52. \{$I\ .+\} printf("Przetwarzanie dyrektywy INCLUDE\n");
  53.  
  54.  
  55. /* wykrycie słów kluczowych bez uwzględniania wielkości liter! */
  56. (?i:PROGRAM) return process_token(yytext, "KW_PROGRAM", "", KW_PROGRAM);
  57. (?i:BEGIN) return process_token(yytext, "KW_BEGIN", "", KW_BEGIN);
  58. (?i:END) return process_token(yytext, "KW_END", "", KW_END);
  59. (?i:USES) return process_token(yytext, "KW_USES", "", KW_USES);
  60. (?i:VAR) return process_token(yytext, "KW_VAR", "", KW_VAR);
  61. (?i:CONST) return process_token(yytext, "KW_CONST", "", KW_CONST);
  62. (?i:IF) return process_token(yytext, "KW_IF", "", KW_IF);
  63. (?i:THEN) return process_token(yytext, "KW_THEN", "", KW_THEN);
  64. (?i:ELSE) return process_token(yytext, "KW_ELSE", "", KW_ELSE);
  65. (?i:CHAR) return process_token(yytext, "KW_CHAR", "", KW_CHAR);
  66. (?i:INTEGER) return process_token(yytext, "KW_INTEGER", "", KW_INTEGER);
  67. (?i:FOR) return process_token(yytext, "KW_FOR", "", KW_FOR);
  68. (?i:TO) return process_token(yytext, "KW_TO", "", KW_TO);
  69. (?i:DO) return process_token(yytext, "KW_DO", "", KW_DO);
  70.  
  71.  
  72.  
  73. /* wykrycie symboli końcowych opisywanych złożonymi wyrażeniami regularnymi */
  74. [A-Za-z_]{alphanum2}* return process_token(yytext, "IDENT", yytext, IDENT);
  75. [+\-]?{num}+ return process_token(yytext, "INTEGER_CONST", yytext, INTEGER_CONST);
  76. [+\-]?({num}*\.{num}+)|({num}+\.) return process_token(yytext, "FLOAT_CONST", yytext, FLOAT_CONST);
  77.  
  78.  
  79. /* wycięcie białych znaków */
  80. [ \t\n] ;
  81.  
  82.  
  83. /* operatory wieloznakowe np.: :=, <= */
  84. ":=" return process_token(yytext, "ASSIGN", "", ASSIGN);
  85. "<=" return process_token(yytext, "LE", "", LE);
  86.  
  87. /* operatory jednoznakowe oraz interpunkcja */
  88. [\-+*/;,:=.{}()] return process_token(yytext, yytext, "", *yytext);
  89.  
  90.  
  91. %%
  92.  
  93. /* Nazwa: process_token
  94. * Cel: Wypisanie informacji o wykrytym elemencie i przekazanie
  95. * tej informacji wyżej z ewentualną wartością elementu, jeśli
  96. * takowa występuje.
  97. * Parametry: text - (i) tekst, do którego nastąpiło dopasowanie;
  98. * TokenType - (i) napis będący tekstową reprezentacją
  99. * nazwy typu elementu;
  100. * TokenVal - (i) wartość elementu, o ile występuje;
  101. * TokenID - (i) identyfikator typu elementu zadeklarowany
  102. * za pomocą dyrektywy %token
  103. * w pliku ada.y.
  104. * Zwraca: Identyfikator typu elementu (TokenID).
  105. * Uwagi: Informacja o wykrytym elemencie zwracana jest
  106. * w trzech kolumnach. W pierwszej wypisywany jest tekst,
  107. * do którego nastąpiło dopasowanie, w drugiej - typ elementu,
  108. * w trzeciej - wartość elementu (o ile występuje).
  109. */
  110. int process_token(const char *text, const char *TokenType,
  111. const char *TokenVal, const int TokenID)
  112. {
  113. int l;
  114. printf("%-20.20s%-15s %s\n", text, TokenType, TokenVal);
  115. switch (TokenID) {
  116.  
  117. case INTEGER_CONST:
  118. yylval.i = atoi(text); break;
  119.  
  120. case FLOAT_CONST:
  121. yylval.d = atof(text); break;
  122.  
  123. case IDENT:
  124. strncpy(yylval.s, text, MAX_STR_LEN); break;
  125.  
  126. case STRING_CONST:
  127. l = strlen(text);
  128. strncpy(yylval.s, text + 1, l - 2 <= MAX_STR_LEN ? l - 1 : MAX_STR_LEN);
  129. break;
  130.  
  131. case CHARACTER_CONST:
  132. yylval.i = text[1]; break;
  133.  
  134. }
  135. return(TokenID);
  136. }/*process_token*/
  137.  
  138.  
  139. int yywrap( void )
  140. { /* funkcja wywoływana po napotkaniu końca strumienia wejściowego */
  141.  
  142. /* sprawdzenie, czy bieżący warunek początkowy automatu YYSTATE */
  143. /* różni się od warunku początkowego INITIAL. Jeżeli tak, */
  144. /* to oznacza to niezamknięty komentarz lub stałą tekstową - */
  145. /* wypisujemy informację o błędzie.*/
  146. /* ..................... */
  147.  
  148.  
  149. return( 1 ); /* koniecznie, by analiza nie rozpoczęła się od nowa */
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement