Advertisement
desdemona

ada to nie wypada

Oct 29th, 2013
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.38 KB | None | 0 0
  1. %{
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #define MAX_STR_LEN 100
  6. #include "ada.tab.h"
  7. int process_token(const char *text, const char *TokenType,
  8.           const char *TokenVal, const int TokenID);
  9. int wiersze = 0;
  10. %}
  11.  
  12.  
  13.  /* pomocnicze */
  14. NUM     [0-9]      
  15. ALPHA       [a-zA-Z]
  16. BIGALPHA    [A-Z]
  17. ALPHANUM    [a-zA-Z0-9]
  18. ALPHA_NUM   [a-zA-Z0-9_]
  19.  
  20. %x STRING
  21. %x COMMENT
  22.  
  23. %%
  24.  
  25.         /* komentarze */
  26.     /*"--".*$   ; */
  27. <INITIAL>"--" { BEGIN COMMENT; }
  28. <COMMENT>[^\n]+ ;
  29. <COMMENT>\n { BEGIN INITIAL; }
  30.  
  31.     /* usuwanie białych znaków */
  32. [ \t]+  ;
  33. \n  { wiersze++; }
  34.  
  35.     /* stałe napisowe STRING_CONST */
  36.     /* \"(\\.|[^\"])*\" { return process_token(yytext, "STRING_CONST", yytext, STRING_CONST); } */
  37. <INITIAL>\" { BEGIN STRING; }
  38. <STRING>(\\.|[^\"])*    { return process_token(yytext, "STRING_CONST", yytext, STRING_CONST); }    
  39. <STRING>\"  { BEGIN INITIAL; }
  40.  
  41.     /* stałe znakowe CHARACTER_CONST */
  42. \'.\'   { return process_token(yytext, "CHARACTER_CONST", yytext, CHARACTER_CONST); }
  43.  
  44.     /* stałe całkowite INTEGER_CONST */
  45. {NUM}+  { return process_token(yytext, "INTEGER_CONST", yytext, INTEGER_CONST); }
  46.  
  47.     /* stałe zmiennoprzecinkowe FLOAT_CONST */
  48. {NUM}+"."{NUM}+(e\-?{NUM}+)?    { return process_token(yytext, "FLOAT_CONST", "", FLOAT_CONST); }
  49.  
  50.     /* słowa kluczowe KW_słowo */
  51. with    { return process_token(yytext, "KW_WITH", "", KW_WITH); }
  52. use { return process_token(yytext, "KW_USE", "", KW_USE); }
  53. procedure   { return process_token(yytext, "KW_PROCEDURE", "", KW_PROCEDURE); }
  54. is  { return process_token(yytext, "KW_IS", "", KW_IS); }
  55. constant    { return process_token(yytext, "KW_CONSTANT", "", KW_CONSTANT); }
  56. begin   { return process_token(yytext, "KW_BEGIN", "", KW_BEGIN); }
  57. "end"   { return process_token(yytext, "KW_END", "", KW_END); }
  58. "for"   { return process_token(yytext, "KW_FOR", "", KW_FOR); }
  59. in      { return process_token(yytext, "KW_IN", "", KW_IN); }
  60. range   { return process_token(yytext, "KW_RANGE", "", KW_RANGE); }
  61. loop    { return process_token(yytext, "KW_LOOP", "", KW_LOOP); }
  62. package { return process_token(yytext, "KW_PACKAGE", "", KW_PACKAGE); }
  63. body    { return process_token(yytext, "KW_BODY", "", KW_BODY); }
  64. out     { return process_token(yytext, "KW_OUT", "", KW_OUT); }
  65. "if"    { return process_token(yytext, "KW_IF", "", KW_IF); }
  66. then    { return process_token(yytext, "KW_THEN", "", KW_THEN); }
  67. "else"  { return process_token(yytext, "KW_ELSE", "", KW_ELSE); }
  68.  
  69.     /* identyfikatory */
  70. {ALPHA}{ALPHA_NUM}* { return process_token(yytext, "IDENT", yytext, IDENT); }
  71.  
  72.     /* operatory przypisania, zakresu, <=, >= */
  73. ":="    { return process_token(yytext, "ASSIGN", "", ASSIGN); }
  74. ".."    { return process_token(yytext, "RANGE", "", RANGE); }
  75. "<="    { return process_token(yytext, "LE", "", LE); }
  76. ">="    { return process_token(yytext, "GE", "", GE); }
  77.    
  78.     /* pozostałe znaki - identyfikatorem jest kod znaku */
  79. .   { return process_token(yytext, yytext, "", yytext[0]); }
  80.  
  81. %%
  82.  
  83. int yywrap()
  84. {
  85.     if(YYSTATE == STRING)
  86.         printf("Niezamkniety napis, rozpoczety w wierszu %d\n", wiersze);
  87.  return 1;
  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 ada.y.
  101.  * Zwraca:  Identyfikator typu elementu (TokenID).
  102.  * Uwagi:   Informacja o wykrytym elemencie zwracana jest
  103.  *      w trzech kolumnach. W pierwszej wypisywany jest tekst,
  104.  *      do którego nastąpiło dopasowanie, w drugiej - typ elementu,
  105.  *      w trzeciej - wartość elementu (o ile występuje).
  106. */
  107. int process_token(const char *text, const char *TokenType,
  108.           const char *TokenVal, const int TokenID)
  109. {
  110.  int l;
  111.  printf("%-20.20s%-15s %s\n", text, TokenType, TokenVal);
  112.  switch (TokenID) {
  113.  
  114.  case INTEGER_CONST:
  115.    yylval.i = atoi(text); break;
  116.  
  117.  case FLOAT_CONST:
  118.    yylval.d = atof(text); break;
  119.  
  120.  case IDENT:
  121.    strncpy(yylval.s, text, MAX_STR_LEN); break;
  122.  
  123.  case STRING_CONST:
  124.    l = strlen(text);
  125.    strncpy(yylval.s, text + 1, l - 2 <= MAX_STR_LEN ? l - 1 : MAX_STR_LEN);
  126.    break;
  127.  
  128.  case CHARACTER_CONST:
  129.    yylval.i = text[1]; break;
  130.  
  131.  }
  132.  return(TokenID);
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement