Advertisement
MMRivers

p2.y

Nov 14th, 2019
1,330
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. %{
  2.  
  3. #include <stdio.h> /* printf() */
  4. #include <string.h> /* strcpy() */
  5. #include "common.h" /* MAX_STR_LEN */
  6. void found( const char *nonterminal, const char *value );
  7. %}
  8.  
  9. %token KW_PROGRAM KW_BEGIN KW_END KW_USES KW_VAR KW_CONST KW_IF KW_THEN KW_ELSE
  10. %token KW_CHAR KW_STRING KW_INTEGER KW_REAL KW_FOR KW_TO KW_DO KW_FUNCTION
  11. %token KW_PROCEDURE
  12. %token ASSIGN LE
  13. %token<s> IDENT STRING_CONST
  14. %token<d> FLOAT_CONST
  15. %token<i> INTEGER_CONST CHARACTER_CONST
  16.  
  17. %union
  18. {
  19.     char s[ MAX_STR_LEN + 1 ];
  20.     int i;
  21.     double d;
  22. }
  23.  
  24.  /* Priorytety operatorów */
  25. %left '+' '-'
  26. %left '*' '/'
  27. %right NEG
  28.  
  29. %%
  30.  
  31.  /* program może być pusty (błąd semantyczny), zawierać błąd składniowy lub
  32.     zawierać: nazwę programu (PROGRAM_NAME), sekcję deklaracji (SECTION_LIST)
  33.     oraz blok główny (BLOCK) zakończony kropką */
  34. Grammar: /* empty */ { yyerror( "Empty input source is not valid!" ); YYERROR; }
  35.     | error
  36.     /* !!!!!!!! od tego miejsca należy zacząć !!!!!!!!!!!! */
  37.     | PROGRAM_NAME SECTION_LIST BLOCK '.' { found("Complete program", ""); }
  38. ;
  39.  
  40.  /* Nazwa programu (PROGRAM_NAME) może nie występować lub być postaci:
  41.     słowo kluczowe "PROGRAM" nazwa_programu (IDENT) średnik */
  42. PROGRAM_NAME:
  43.     | KW_PROGRAM IDENT ';' { found( "PROGRAM_NAME", $2 ); }
  44. ;
  45.  
  46. /* lista sekcji (SECTION_LIST) składa się z dowolnej (również zerowej) liczby
  47.     sekcji (SECTION) */
  48. SECTION_LIST:
  49.     | SECTION_LIST SECTION
  50. ;
  51.    
  52.  /* sekcja (SECTION) może być: sekcją deklaracji stałych (CONST_SECT),
  53.     sekcją deklaracji
  54.     zmiennych (VAR_SECT), funkcją (FUNCTION) lub procedurą (PROCEDURE) */
  55. SECTION: CONST_SECT
  56.     | VAR_SECT
  57.     | FUNCTION
  58.     | PROCEDURE
  59. ;
  60.  
  61.  /* SEKCJA CONST */
  62.  
  63.  /* sekcja CONST (CONST_SECT) zawiera słowo kluczowe CONST, po którym następuje
  64.     lista deklaracji (CONST_LIST) zakończona średnikiem */
  65. CONST_SECT: KW_CONST CONST_LIST ';' { found( "CONST_SECT", "" ); }
  66. ;
  67.  
  68.  /* lista deklaracji (CONST_LIST) zawiera jedną lub więcej deklaracji (CONST)
  69.     rozdzielonych średnikiem */
  70. CONST_LIST: CONST
  71.     | CONST_LIST ';' CONST
  72. ;
  73.  
  74.  /* deklaracja stałej (CONST) składa się z identyfikatora, znaku równości ('=')
  75.     oraz z wartości dosłownej (LITERAL) */
  76. CONST: IDENT '=' LITERAL { found( "CONST", $1 ); }
  77. ;
  78.  
  79.  /* Wartość dosłowna (LITERAL) może być liczbą całkowitą (INTEGER_CONST),
  80.     liczbą rzeczywistą (FLOAT_CONST) lub napisem (STRING_CONST) */
  81. LITERAL: INTEGER_CONST
  82.     | FLOAT_CONST
  83.     | STRING_CONST
  84. ;
  85.  
  86. /* SEKCJA VAR */
  87.  
  88.  /* sekcja VAR (VAR_SECT) rozpoczyna się słowem kluczowym VAR,
  89.     po którym następuje
  90.     lista deklaracji (VAR_LIST) zakończona średnikiem, np. "Var
  91.    i : Integer; c : Char; */
  92. VAR_SECT: KW_VAR VAR_LIST ';' { found( "VAR_SECT", "" ); }
  93. ;
  94.  
  95. /* lista deklaracji (VAR_LIST) składa się z jednej lub więcej deklaracji (VAR)
  96.    oddzielonych średnikami */
  97. VAR_LIST: VAR
  98.     | VAR_LIST ';' VAR
  99. ;
  100.  
  101. /* deklaracja VAR składa się z listy identyfikatorów (IDENT_LIST),
  102.    po której następuje dwukropek i nazwa typu danych (DATA_TYPE) */
  103. VAR: IDENT_LIST ':' DATA_TYPE { found( "VAR", "" ); }
  104. ;
  105.  
  106. /* lista identyfikatorów (IDENT_LIST) zawiera jeden lub więcej identyfikatorów
  107.    (IDENT) rozdzielonych przecinkami */
  108. IDENT_LIST: IDENT
  109.     | IDENT_LIST ',' IDENT
  110. ;
  111.  
  112. /* nazwa typu danych (DATA_TYPE) to jedno ze słów kluczowych Integer, Real,
  113.    Char, String */
  114. DATA_TYPE: KW_INTEGER
  115.     | KW_REAL
  116.     | KW_CHAR
  117.     | KW_STRING
  118. ;
  119.  
  120. /* DEKLARACJA FUNKCJI I PROCEDURY */
  121.  
  122. /* deklaracja procedury (PROCEDURE) składa się ze: słowa kluczowego PROCEDURE,
  123.    nagłówka funkcji (FUN_HEAD), listy sekcji (SECTION_LIST)
  124.    oraz bloku (BLOCK) */
  125. PROCEDURE: KW_PROCEDURE FUN_HEAD SECTION_LIST BLOCK { found( "PROCEDURE", $<s>2 ); }
  126. ;
  127.  
  128. /* deklaracja funkcji (FUNCTION) składa się z: słowa kluczowego FUNCTION,
  129.    nagłówka
  130.    funkcji (FUN_HEAD), dwukropka oraz typu zwracanej przez funkcję wartości
  131.    (DATA_TYPE), listy sekcji (SECTION_LIST) oraz bloku (BLOCK) */
  132. FUNCTION: KW_FUNCTION FUN_HEAD ':' DATA_TYPE SECTION_LIST BLOCK { found( "FUNCTION", $<s>2 ); }
  133. ;
  134.  
  135. /* nagłówek funkcji (FUN_HEAD) rozpoczyna się identyfikatorem (IDENT),
  136.    po którym w
  137.    nawiasach okrągłych znajdują się parametry formalne (FORM_PARMS) */
  138. FUN_HEAD: IDENT '(' FORM_PARAMS ')' { found("FUN_HEAD", $1); }
  139. ;
  140.  
  141. /* parametry formalne (FORM_PARAMS mogą być puste
  142.    lub mogą być listą parametrów formalnych (FORM_PARM_LIST) */
  143. FORM_PARAMS:
  144.     | FORM_PARAM_LIST
  145. ;
  146.  
  147. /* lista parametrów formalnych (FORM_PARAM_LIST) zawiera 1 lub więcej
  148.    parametrów formalnych (FORM_PARM) rozdzielonych przecinkiem */
  149. FORM_PARAM_LIST: FORM_PARAM
  150.     | FORM_PARAM_LIST ',' FORM_PARAM
  151. ;
  152.  
  153. /* parametr formalny (FORM_PARAM) składa się z listy identyfikatorów
  154.    (IDENT_LIST), dwukropka oraz określenia typu (DATA_TYPE) */
  155. FORM_PARAM: IDENT_LIST ':' DATA_TYPE { found( "FORM_PARAM", "" ); }
  156. ;
  157.  
  158. /* BLOK INSTRUKCJI */
  159.  
  160. /* blok instrukcji (BLOCK) składa się ze słowa kluczowego BEGIN, instrukcji
  161.    (INSTRUCTIONS) oraz słowa kluczowego END. Należy uwzględnić 2 wersje - ze
  162.    średnikiem przed END lub bez niego */
  163. BLOCK: KW_BEGIN INSTRUCTIONS KW_END { found( "BLOCK", "" ); }
  164. ;
  165.  
  166. /* Instrukcje (INSTRUCTIONS) mogą być puste lub moga być listą instrukcji
  167.   (INSTR_LIST) */
  168. INSTRUCTIONS:
  169.     | INSTR_LIST ';'
  170. ;
  171.  
  172. /* lista instrukcji (INSTR_LIST) może zawierać jedną lub więcej instrukcji
  173.    (INSTRUCTION) rozdzielonych średnikami */
  174. INSTR_LIST: INSTRUCTION
  175.     | INSTR_LIST ';' INSTRUCTION
  176. ;
  177.  
  178. /* instrukcją (INSTRUCTION) może być: wywołanie funkcji (FUNCT_CALL),
  179.    instrukcja FOR (FOR_INSTR),
  180.    przypisanie (ASSIGN_INSTR), instrukcja warunkowa if (IF_INSTR) */
  181. INSTRUCTION: FUNCT_CALL
  182.     | FOR_INSTR
  183.     | ASSIGN_INSTR
  184.     | IF_INSTR
  185. ;
  186.  
  187. /* INSTRUKCJE PROSTE i KONSTRUKCJE ZŁOŻONE */
  188.  
  189. /* wywołanie funkcji (FUNCT_CALL) składa się z identyfikatora
  190.    oraz parametrów aktualnych
  191.    (ACT_PARAMS) umieszczonych w nawiasach okrągłych. Alternatywną postacią
  192.    wywołania funkcji jest po prostu jej nazwa (IDENT) bez nawiasów. */
  193. FUNCT_CALL: IDENT '(' ACT_PARAMS ')' { found( "FUNCT_CALL", $1); }
  194.     | IDENT { found( "FUNCT_CALL", $1); }
  195. ;
  196.  
  197. /* parametry aktualne (ACT_PARAMS) mogą być puste lub zawierać listę parametrów
  198.    (ACT_PARAM_LIST) */
  199. ACT_PARAMS:
  200.     | ACT_PARAM_LIST
  201. ;
  202.  
  203. /* lista parametrów aktualnych (ACT_PARAM_LIST) może zawierać
  204.    jeden parametr aktualny
  205.    (ACT_PARAM) lub składać się z parametrów aktualnych oddzielonych
  206.    od siebie przecinkiem */
  207. ACT_PARAM_LIST: ACT_PARAM
  208.     | ACT_PARAM_LIST ',' ACT_PARAM
  209. ;
  210.  
  211. /* parametr aktualny (ACT_PARAM) może być: napisem (STRING_CONST),
  212.    liczbą (NUMBER) lub
  213.    wywołaniem funkcji (FUNCT_CALL), które wyjątkowo oznacza również
  214.    identyfikator! */
  215. ACT_PARAM: STRING_CONST { found( "ACT_PARAM", ""); }
  216.     | NUMBER { found( "ACT_PARAM", ""); }
  217.     | FUNCT_CALL { found( "ACT_PARAM", ""); }
  218. ;
  219.  
  220. /* liczba (NUMBER) może być liczbą całkowitą (INTEGER_CONST)
  221.    lub rzeczywistą (FLOAT_CONST) */
  222. NUMBER: INTEGER_CONST
  223.     | FLOAT_CONST
  224. ;
  225.  
  226. /* przypisanie (ASSIGN_INSTR) składa się z identyfikatora,
  227.    operatora przypisania (ASSIGN) oraz wyrażenia (EXPR) */
  228. ASSIGN_INSTR: IDENT ASSIGN EXPR { found( "ASSIGN_INSTR", $<s>1); }
  229. ;
  230.  
  231. /* wyrażenie (EXPR) może być: liczbą lub identyfikatorem, sumą, różnicą,
  232.    iloczynem, ilorazem oraz negacją wyrażeń, a także wyrażeniem w nawiasach.
  233.    Należy uwzględnić wyższy priorytet minusa jednoargumentowego!!!  */
  234. EXPR: NUMBER
  235.     | IDENT
  236.     | EXPR '+' EXPR
  237.     | EXPR '*' EXPR
  238.     | EXPR '-' EXPR
  239.     | EXPR '/' EXPR
  240.     | '-' EXPR %prec NEG
  241.     | '(' EXPR ')'
  242. ;
  243.  
  244. /* instrukcja FOR (FOR_INSTR) składa się ze słowa kluczowego FOR,
  245.    identyfikatora,
  246.    znaku podstawienia (ASSIGN), danej CONST_VAR, słowa kluczowego
  247.    TO, danej CONST_VAR, słowa kluczowego DO oraz bloku instrukcji
  248.    (BLOCK_INSTR) */
  249. FOR_INSTR: KW_FOR IDENT ASSIGN CONST_VAR KW_TO CONST_VAR KW_DO BLOCK_INSTR { found( "FOR_INSTR", ""); }
  250. ;
  251.  
  252. /* dana (CONST_VAR) może być liczbą całkowitą lub identyfikatorem */
  253. CONST_VAR: KW_INTEGER
  254.     | IDENT
  255. ;
  256.  
  257. /* blok instrukcji (BLOCK_INSTR) może być blokiem (BLOCK) lub pojedynczą
  258.    instrukcją (INSTRUCTION) */
  259. BLOCK_INSTR: BLOCK
  260.     | INSTRUCTION
  261. ;
  262.  
  263. /* instrukcja if */
  264. IF_INSTR: KW_IF EXPR '>' EXPR KW_THEN IF_INSTR_BLOCK { found( "IF_INSTR", ""); }
  265.     | KW_IF '(' EXPR '>' EXPR ')' KW_THEN IF_INSTR_BLOCK { found( "IF_INSTR", ""); }
  266. ;
  267.  
  268. IF_INSTR_BLOCK: INSTRUCTION
  269.     | INSTRUCTION KW_ELSE INSTRUCTION
  270. ;
  271.  
  272. %%
  273.  
  274.  
  275. int main( void )
  276. {
  277.     int ret;
  278.     printf( "Autor: Imie i Nazwisko\n" );
  279.     printf( "yytext              Typ tokena      Wartosc tokena znakowo\n\n" );
  280.     ret = yyparse();
  281.     return ret;
  282. }
  283.  
  284. int yyerror( const char *txt )
  285. {
  286.     printf( "Syntax error %s\n", txt );
  287. }
  288.  
  289. void found( const char *nonterminal, const char *value )
  290. { /* informacja o znalezionych strukturach składniowych (nonterminal) */
  291.     printf( "===== FOUND: %s %s%s%s=====\n", nonterminal,
  292.             (*value) ? "'" : "", value, (*value) ? "'" : "" );
  293. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement