Advertisement
desdemona

parser.y

Nov 11th, 2013
281
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.21 KB | None | 0 0
  1. %{
  2. /****************************************************************************
  3. parser.y
  4. ParserWizard generated YACC file.
  5. Author: Agnieszka Kuberska
  6. Date: 29 pazdziernik 2013
  7. ****************************************************************************/
  8.  
  9. #include <stdio.h> /* printf() */
  10. #include <string.h> /* strcpy() */
  11. #include "common.h" /* MAX_STR_LEN */
  12. #if defined( PG )
  13. #include <conio.h> /* getch() */
  14. #include "lexer.h" /* tylko dla Parser Generatora */
  15. #endif
  16.  /* informacja o znalezionych strukturach sk³adniowych (nonterminal) */
  17. void found( const char *nonterminal, const char *value );
  18.  /* przykladowe wywolanie found( "DEKLARACJA", "" ); */
  19. %}
  20.  
  21.  /***************************************************************************/
  22.  /*           declarations section - place any declarations here            */
  23.  /***************************************************************************/
  24.  
  25.  /* DEKLARACJA TOKENÓW */
  26. %token KW_CHAR KW_UNSIGNED KW_SHORT KW_INT KW_LONG KW_FLOAT KW_VOID KW_FOR KW_DOUBLE KW_IF
  27. %token INT_NUMBER FLOAT_NUMBER IDENT TEXT_CONST KW_ELSE
  28. %token INC LE
  29.  
  30. %union
  31. { /* DEKLARACJA TYPU TOKENÓW */
  32.     char s[ MAX_STR_LEN + 1 ]; /* pole tekstowe dla nazw itp. */
  33.     int i; /* pole ca³kowite */
  34.     double d; /* pole zmiennoprzecinkowe */
  35. }
  36.  
  37.  /* Priorytety operacji arytmetycznych '+' '-' '*' '/' 'NEG' */
  38. %left '+' '-'
  39. %left '*' '/'
  40. %right NEG
  41.  
  42. %type <s> FUN_HEAD IDENT
  43. %%
  44.  
  45.  /***************************************************************************/
  46.  /* rules section - place your YACC rules here (there must be at least one) */
  47.  /***************************************************************************/
  48.  
  49.  /* STRUKTURA PROGRAMU W C-- */
  50.  
  51.  /* program mo¿e byæ pusty (b³¹d semantyczny), zawieraæ b³¹d sk³adniowy lub
  52.     sk³adaæ siê z listy sekcji (SECTION_LIST) */
  53. Grammar: { yyerror( "Plik jest pusty" ); YYERROR; }
  54.     | error
  55.     |SECTION_LIST
  56.     /* !!!!!!!! od tego miejsca nale¿y zacz¹æ !!!!!!!!!!!! */
  57. ;
  58.  /* lista sekcji sk³ada siê przynajmniej z 1 sekcji (SECTION) */
  59. SECTION_LIST: SECTION_LIST SECTION
  60.     | SECTION
  61. ;
  62.  
  63.  /* sekcja mo¿e byæ deklaracj¹ (S_DECLARATION) lub funkcj¹ (S_FUNCTION) */
  64. SECTION: S_DECLARATION
  65.     | S_FUNCTION
  66. ;
  67.  
  68.  /* DEKLARACJE DANYCH */
  69.  
  70.  
  71.  /* deklaracja danych sk³ada siê z okreœlenia typu (DATA_TYPE) oraz listy
  72.     zmiennych (VAR_LIST) zakoñczonych œrednikiem */
  73. S_DECLARATION: DATA_TYPE VAR_LIST ';' {found("deklaracja zmiennych", "");}
  74. ;
  75.  
  76.  /* typ mo¿e byæ jednym z typów prostych: char, unsigned char, short, unsigned short,
  77.     int, unsigned int, unsigned, long, unsigned long, float, double */
  78. DATA_TYPE: KW_CHAR
  79.     | KW_UNSIGNED KW_CHAR
  80.     | KW_SHORT
  81.     | KW_UNSIGNED KW_SHORT
  82.     | KW_INT
  83.     | KW_UNSIGNED KW_INT
  84.     | KW_UNSIGNED
  85.     | KW_LONG
  86.     | KW_UNSIGNED KW_LONG
  87.     | KW_FLOAT
  88.     | KW_DOUBLE
  89. ;
  90.  
  91.  
  92.  /* lista zmiennych sk³ada siê przynajmniej z jednej zmiennej (VAR).
  93.     Wiêksza liczba zmiennych powinna byæ oddzielona przecinkiem */
  94. VAR_LIST: VAR
  95.     |VAR_LIST ',' VAR
  96. ;
  97.  
  98.  
  99.  /* zmienna jest identyfikatorem lub identyfikatorem z podstawieniem wartoœci
  100.     pocz¹tkowej, która mo¿e byæ wyra¿eniem arytmetyczno-logicznym (EXPR) lub
  101.     napisem (TEXT_CONST) */
  102.  
  103. VAR: IDENT
  104.     |IDENT '=' FLOAT_NUMBER
  105.     |IDENT '=' INT_NUMBER
  106.     |IDENT '=' TEXT_CONST
  107. ;
  108.  
  109.  /* DEKLARACJE FUNKCJI */
  110.  
  111.  /* deklaracja funkcji sk³ada siê z okreœlenia typu zwracanego przez funkcjê
  112.     (DATA_TYPE lub KW_VOID), nag³ówka funkcji (FUN_HEAD) oraz cia³a funkcji
  113.     (BLOCK). UWAGA! Nale¿y stworzyæ dwie oddzielne regu³y dla DATA_TYPE oraz KW_VOID */
  114. S_FUNCTION: DATA_TYPE FUN_HEAD BLOCK {found("deklaracja funkcji", "");}
  115.     |KW_VOID FUN_HEAD BLOCK {found("deklaracja funkcji", "");}
  116. ;
  117.  
  118.  /* nag³ówek funkcji rozpoczyna siê identyfikatorem (IDENT), po którym w
  119.     nawiasach okr¹g³ych znajduj¹ siê argumenty formalne (ARG_FORMS) */
  120. FUN_HEAD: IDENT '(' ARG_FORMS')'
  121. ;
  122.  
  123.  /* argumenty formalne mog¹ byæ s³owem kluczowym void lub list¹ parametrów
  124.     formalnych (ARG_FORM_LIST) */
  125. ARG_FORMS: KW_VOID
  126. ;
  127.  
  128.  /* lista parametrów formalnych mo¿e byæ s³owem kluczowym void lub co najmniej
  129.     jednym argumentem formalnym ARG_FORM (parametry formalne s¹ rozdzielane przecinkiem) */
  130. ARG_FORM_LIST: KW_VOID
  131. ;
  132.  
  133.  /* parametr formalny sk³ada siê z definicji typu (DATA_TYPE) oraz identyfikatora (IDENT) */
  134.  
  135.  
  136.  /* blok sk³ada siê z umieszczonych w nawiasach klamrowych listy deklaracji danych (DECL_LIST)
  137.     oraz lista instrukcji (INSTR_LIST) */
  138. BLOCK: '{' DECL_LIST'}'
  139. ;
  140.  
  141.  /* lista deklaracji mo¿e byæ pusta lub sk³adaæ siê z deklaracji (DECLARATION) */
  142. DECL_LIST:
  143. ;
  144.  
  145.  /* lista instrukcji mo¿e byæ pusta lub sk³adaæ siê z instrukcji (INSTRUCTION) */
  146.  
  147.  
  148. /* INSTRUKCJE PROSTE i KONSTRUKCJE Z£O¯ONE
  149.  
  150.  /* instrukcj¹ mo¿e byæ: instrukcja pusta (;), wywo³anie funkcji (FUN_CALL),
  151.     instrukcja for (FOR_INSTR), przypisanie (ASSIGNMENT) zakoñczone œrednikiem,
  152.     zwiêkszenie wartoœci zmiennej (INCR) zakoñczone œrednikiem,
  153.     instrukcja warunkowa (IF_INSTR) lub blok */
  154.  
  155.  
  156.  /* wywo³anie funkcji sk³ada siê z identyfikatora oraz argumentów aktualnych (ARG_ACTS)
  157.     umieszczonych w nawiasach okr¹g³ych. Ca³oœæ jest zakoñczona œrednikiem. */
  158.  
  159.  
  160.  /* argumenty aktualne mog¹ byæ puste lub zawieraæ listê argumentów */
  161.  
  162.  
  163.  /* lista argumentów aktualnych mo¿e zawieraæ jeden argument aktualny (ARG_ACT)
  164.     lub sk³adaæ siê z argumentów aktualnych oddzielonych od siebie przecinkiem */
  165.  
  166.  
  167.  /* argument aktualny mo¿e byæ identyfikatorem (IDENT), napisem (TEXT_CONST),
  168.     lub liczb¹ (NUMBER) */
  169.  
  170.  
  171.  /* liczba mo¿e byæ liczb¹ ca³kowit¹ lub rzeczywist¹ */
  172.  
  173.  
  174.  /* inkrementacja sk³ada siê z identyfikatora oraz operatora inkrementacji (INC) */
  175.  
  176.  
  177.  /* przypisanie sk³ada siê z identyfikatora, operatora podstawienia oraz wyra¿enia */
  178.  
  179.  
  180.  /* wyra¿enie (EXPR) mo¿e byæ: liczb¹, dodawaniem, odejmowaniem, mno¿eniem, dzieleniem,
  181.     negacj¹ lub wyra¿eniem w nawiasach  */
  182.  
  183.  
  184.  /* instrukcja for w uproszczonej wersji */
  185.  
  186.  
  187.  
  188.  /* instrukcja if */
  189.  
  190.  
  191.  /* pêtla while .. do */
  192.  
  193.  
  194.  /* pêtla do .. while */
  195.  
  196.  
  197. %%
  198.  
  199.  /***************************************************************************/
  200.  /*                            programs section                             */
  201.  /***************************************************************************/
  202.  
  203. int main( void )
  204. {
  205.     int ret;
  206.     printf( "Autor: Imie i Nazwisko\n" );
  207.     printf( "yytext              Typ tokena      Wartosc tokena znakowo\n\n" );
  208. #if defined( PG ) /* Parser Generator */
  209.     /* poni¿sza inicjalizacja strumieni wy³¹cznie dla Parser Generatora */
  210.     yyin = stdin;
  211.     yyout = stdout;
  212.     yylexerr = stderr;
  213. #endif
  214.     /* wywo³anie parsera */
  215.     ret = yyparse();
  216. #if defined( PG ) /* Parser Generator */
  217.     getch();
  218. #endif
  219.     return ret;
  220. }
  221.  
  222. #if defined( PG ) /* Parser Generator */
  223. void yyerror( const char *txt )
  224. #else
  225. int yyerror( const char *txt )
  226. #endif
  227. {
  228.     printf( "Syntax error %s", txt );
  229. #if !defined( PG ) /* Parser Generator */
  230.     return( 0 );
  231. #endif
  232. }
  233.  
  234. void found( const char *nonterminal, const char *value )
  235. { /* informacja o znalezionych strukturach sk³adniowych (nonterminal) */
  236.     printf( "===== FOUND: %s %s%s%s=====\n", nonterminal,
  237.         (*value) ? "'" : "", value, (*value) ? "'" : "" );
  238. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement