Y A C C Generator analizatorów składniowych. GENERATOR YACC Zadaniem generatora YACC jest wygenerowanie kodu źródłowego analizatora składniowego (domyślnie)

Slides:



Advertisements
Podobne prezentacje
C++ wykład 2 ( ) Klasy i obiekty.
Advertisements

Język C/C++ Funkcje.
Programowanie obiektowe
Mgr inż.Marcin Borkowski Podstawy Java Krótkie wprowadzenie dla studentów Wyższej Szkoły Ekologii i Zarządzania
Programowanie obiektowe
Wzorce.
Język ANSI C Funkcje Wykład: Programowanie komputerów
Prowadzący: mgr inż. Elżbieta Majka
Języki programowania C++
PROGRAMOWANIE STRUKTURALNE
formatowanie kodu źródłowego
Analiza Składniowa Wstępująca
Lingwistyka Matematyczna
Generator analizatorów składniowych
Metoda pierwszeństwa operatorów
ODE Triggery. Wstęp n Triggery są trójką zdarzenie-warunek-akcja (event-condition- action). n Zdarzenia mogą być proste lub złożone, co zostanie omówione.
Programowanie imperatywne i język C Copyright, 2004 © Jerzy R. Nawrocki Wprowadzenie.
Programowanie imperatywne i język C Copyright, 2004 © Jerzy R. Nawrocki Wprowadzenie.
1 Dygresja: cztery płyty główne…. 2 Dygresja: osobliwości C /* cos o nieistniejacym typie Boolean */ /* oraz o operatorze przecinkowym */ #include int.
XML. Pierwszy dokument XML Witaj świecie! Elementy i atrybuty niezwykle oryginalny Witaj świecie! Druga możliwość: Witaj świecie!
Biblioteki i przestrzenie nazw
Ogólne jednostki programowe 1
Java – programowanie obiektowe
Podstawy programowania
Pakiety w Javie Łukasz Smyczyński (132834). Czym są pakiety? Klasy w Javie są grupowane w pewne zbiory zwane pakietami. Pakiety są więc pewnym podzbiorem.
Podstawy programowania
Podstawy programowania
Programowanie strukturalne i obiektowe
KONSTRUKCJA KOMPILATORÓW WYKŁAD WYKŁAD Robert Plebaniak Robert Plebaniak.
Podstawy programowania. Język C i C++– podstawy Temat: 1
Generator analizatorów leksykalnych
Generator analizatorów składniowych
Programowanie strukturalne i obiektowe
Programowanie obiektowe – zastosowanie języka Java SE
Andrzej Repak Nr albumu
Przekazywanie parametrów do funkcji oraz zmienne globalne i lokalne
Gramatyki i translatory
MICROSOFT Access TWORZENIE MAKR
Prasek Aneta, Skiba Katarzyna. Funkcje stałe const to takie funkcje, które nie mogą modyfikować stanu obiektu. Oznacza to, że funkcja stała nie może zmieniać.
Projektowanie stron WWW
Wzorce slajdów programu microsoft powerpoint
Podstawy języka Instrukcje - wprowadzenie
Podstawy programowania
ZAPIS BLOKOWY ALGORYTMÓW
C++.
Funkcje w C++ Funkcja – wydzielony fragment kodu użyty w programie (raz lub więcej razy) spełniający określone zadanie, np. obliczenie średniej ocen.
Gramatyki Lindenmayera
Programowanie strukturalne i obiektowe C++
Zagadnienia AI wykład 6.
Programowanie proceduralne Podstawy Programowania dla geoinformatyków Wykład 3 Rafał Witkowski, 2015.
Języki formalne Copyright, 2006 © Jerzy R. Nawrocki Wprowadzenie do informatyki Wykład.
Formatowanie dokumentów
ANALIZA SKŁADNIOWA.
I TY ZOSTAŃ WEBMASTEREM! CZĘŚĆ 2 – „STRUKTURA STRONY” STWORZYŁ GABRIEL ŚLAWSKI.
Programowanie imperatywne i język C Copyright, 2007 © Jerzy R. Nawrocki Wstęp do.
Podstawy programowania
Wykład 2 Programowanie obiektowe. Programowanie obiektowe wymaga dobrego zrozumienia działania funkcji definiowanych przez użytkownika, w ten sposób będziemy.
Seminarium Dyplomowe: Metodyka i Techniki Programowania Autor: Bartłomiej Fornal.
Dokumentacja programu komputerowego i etapy tworzenia programów.
Wstęp do programowania Wykład 9
Mapa STL – C++. Problem polega na tym, że najczęściej chcielibyśmy przechowywać w zbiorze elementy jakiegoś bardziej złożonego typu, których on nie będzie.
Wstęp do programowania Wykład 2 Dane, instrukcje, program.
Podstawy informatyki Preprocesor Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego Matuszyka Podstawy.
K URS JĘZYKA C++ – WYKŁAD 3 ( ) Przenoszenie Składowe statyczne Funkcje wbudowane Argumenty domyślne.
Wskaźniki Elżbieta Labocha.
Programowanie obiektowe – zastosowanie języka Java SE
Haskell Składnia funkcji.
Język C++ Typy Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego.
Zapis prezentacji:

Y A C C Generator analizatorów składniowych

GENERATOR YACC Zadaniem generatora YACC jest wygenerowanie kodu źródłowego analizatora składniowego (domyślnie) w języku C; Pożyteczną rzeczą jest fakt, iż generator Yacc doskonale współpracuje z generatorem analizatorów leksykalnych Lex. Kod źródłowy generowany jest przez Yacc’a w oparciu o plik ze specyfikacją; Plik z regułami tworzony jest przez samego użytkownika; 2

GENERATOR YACC Schemat organizacji działania Yacc’a: scan.l scan.c scane.exe plik.txt WYNIK G C C L E X 3 gram.y YACC y.tab.c y.tab.h

GENERATOR YACC Plik y.tab.c jest reprezentacją analizatora LALR napisaną w C, razem z innymi procedurami w języku C, które użytkownik mógł przygotować; Plik y.tab.c jest reprezentacją analizatora LALR napisaną w C, razem z innymi procedurami w języku C, które użytkownik mógł przygotować; Opcja kompilacji "-d" powoduje zapisanie pliku nagłówkowego y.tab.h, w którym będą znajdować się definicje tokenów języka; 4

GENERATOR YACC flex –l scan.l (użycie generatora LEX) flex –l scan.l (użycie generatora LEX)lex.yy.c yacc -d gram.y (uzycie generatora Yacc dla pliku specyfikacji gram.y) y.tab.c i y.tab.h gcc y.tab.c lex.yy.c (kompilacja C++) gcc y.tab.c lex.yy.c (kompilacja C++)./a.out < plik.in (analiza pliku) 5 5

GENERATOR YACC Ważną cechą analizatora jest możliwość wykorzystania go do większych aplikacji; Każdy wygenerowany kod źródłowy zawiera bowiem funkcję, dzięki której można podłączyć analizator składniowy do innych aplikacji. Funkcja o której mowa to yyparse(); Każdy wygenerowany kod źródłowy zawiera bowiem funkcję, dzięki której można podłączyć analizator składniowy do innych aplikacji. Funkcja o której mowa to yyparse(); 6

GENERATOR YACC Zasady działania programu:  Wygenerowany przez program YACC analizator redukujący działa w oparciu o tablicę LALR;  Jako symbol startowy gramatyki, przyjmowany jest, przez domniemanie, nieterminal znajdujący się po lewej stronie pierwszej produkcji; 7

GENERATOR YACC  Wygenerowany parser ma postać funkcji int yyparse(). Aby uruchomić parser zawarty w tej funkcji potrzebujemy dwóch innych funkcji: main() i yylex();  Funkcja main(), która wywołuje funkcję yyparse();  Parser wywołuje lexer (yylex()), kiedy tylko pobiera token z wejścia;  Yacc definiuje nazwy tokenów w parserze jako nazwy preprocesora C w y.tab.h, więc lexer może je użyć. 8

GENERATOR YACC  Gdy lexer znajdzie token, który interesuje parser, zwraca do parsera jego numeryczną wartość, umieszczając ja w zmiennej yyval;  Funkcja yylex może być umieszczona w osobnym module (np. generowana programem lex);  Jeżeli korzystamy z zewnętrznego skanera, przy kompilacji dokładamy opcję "-d„ (y.tab.h, w którym będą zawarte definicje tokenów języka); 9

TWORZENIE PLIKU SPECYFIKACJI Każdy plik ze specyfikacją dla programu Yacc powinien składać się z trzech sekcji; Pierwsza sekcja to sekcja definicji; W sekcji definicji umieszczamy, jak sama nazwa wskazuje, definicje i deklaracje zmiennych, stałych, deklaracje stanów oraz makra procesora; 10

TWORZENIE PLIKU SPECYFIKACJI Sekcja definicji może zawierać fragment kodu, który system przepisze bezpośrednio do analizatora składniowego; Kod ten musi być odpowiednio „opakowany”; Otwarcie fragmentu bezpośrednio przepisywanego do analizatora powinno być poprzedzone znacznikiem %{, natomiast jej zamknięcie %}; 11

TWORZENIE PLIKU SPECYFIKACJI Przykład budowy sekcji definicji: Przykład budowy sekcji definicji:%{#include<iostream.h> int zmienna; int zmienna_druga=1; %} 12

TWORZENIE PLIKU SPECYFIKACJI Druga sekcja to sekcja przetwarzania; W sekcji przetwarzania umieszczamy wszelkie reguły postępowania, zgodnie z którymi wygenerowany będzie analizator; Reguły postępowania to inaczej przepisy na to co analizator ma zrobić gdy dokona redukcji zgodnie ze związaną z tą operacją produkcją; 13

TWORZENIE PLIKU REGUŁ Budowa reguły przetwarzania opiera się na dwóch zasadniczych częściach: produkcji i operacji; Jej budowa wygląda więc: produkcjaoperacja Produkcja jest zapisana w notacji programu Yacc. Strzałka w produkcji jest zastąpiona znakiem „ : ”; Operacja jest blokiem instrukcji języka C; 14

TWORZENIE PLIKU SPECYFIKACJI Jeśli w gramatyce mamy produkcję S->T+T, to przykładowa reguła produkcji może wyglądać nastepująco: S : T ‘+’ T {printf(”liczba + liczba”);} ; Podobnie jak w przypadku LLgen terminale, które nie są literałami (są nazwane) muszą być zadeklarowane za pomocą słowa kluczowego %token; 15

NOTACJA YACC’a Rozważmy gramatykę, w której zbiór produkcji jest następujący: E -> E + T; E -> T; T -> T * F; T -> F; F -> ( E ); F -> num; 16

ANALIZA ZSTĘPUJĄCA Sprawdźmy, w jaki sposób można te produkcje przedstawić w notacji Yacc’a? %token num % E : E ‘+’ T | T | T ; T : T ‘*’ F | F | F ; E->E+T E->T T->T*F T->F F->(E) F->num 17 F : ‘(‘ E ’)’ | num | num ;

NOTACJA YACC’a Niech G będzie gramatyką z produkcjami T->(T) i T-> . Wtedy pustą produkcję możemy zapisać w notacji Yacc następująco: % T : ‘(‘ T ‘)’ |; 18

AKCJE SEMANTYCZNE Akcja semantyczna Yacc’a jest sekwencją instrukcji w C; Symbol $$ odwołuje się do wartości atrybutu skojarzonej z nieterminalem po lewej stronie; Symbol $i odwołuje się do wartości skojarzonej z i-tym symbolem gramatyki po prawej stronie; Akcja semantyczna wywoływana jest zawsze, gdy redukujemy według związanej z nią produkcji; 19

AKCJE SEMANTYCZNE Rozważmy dwie produkcje: E->E+T | T; wyr : wyr ‘+’ term {$$ = $1 +$3;} | term ; 20

21 %{ #include „y.tab.h” %} % [+-()] return yytext[0]; [0-9]+ return liczba; [ \t] ;. Yy_fatal(”???”); %token liczba % E : E ‘+’ T | T ; T : T ‘-’ F | F ; F : ‘(‘ E ‘)’ | liczba ; #define liczba 257 num+num21+18 wejście y.tab.h

WSPÓŁPRACA Z LEX Aby powiązać Yacc z Lex’em musimy stworzyć analizator leksykalny, który będzie zwracał kolejny odnaleziony symbol; %{ #include ”y.tab.h” %}% [+-() ] return yytext[0]; [0-9]+ return liczba; [ \t] ;. YY_FATAL(”???”); 22

Współpraca z LEX Teraz możemy dopisać analizator składniowy: %token liczba % S : S ’+’ T | T ; T : T ’-’ W | W ; 23 W : ’(‘ S ’)’ | liczba ;

24 %{ #include ”y.tab.h” %} % [+ - ()] return yytext[0]; [0-9]+ return liczba; [ \t] ;. YY_FATAL(”???”); %token liczba % S : S ‘+’ T | T ; T : T ‘-’ W | W ; W : ‘(‘ S ‘)’ | liczba ; OK BŁĄD

25 %{ #include „y.tab.h” %} % [+ - ()] return yytext[0]; [0-9]+ return liczba; [ \t] ;. Yy_fatal(”???”); %token liczba % S : S ‘+’ T | T ; T : T ‘-’ W | W ; W : ‘(‘ S ‘)’ | liczba ; 14*4 BŁĄD

26 %{ #include „y.tab.h” %} % [+*()] return yytext[0]; [0-9]+ return liczba; [ \t] ;. Yy_fatal(”???”); %token liczba % S : S ‘+’ T | T ; T : T ‘*’ W | W ; W : ‘(‘ S ‘)’ | liczba ; OK

Współpraca z LEX Teraz możemy dopisać produkcję akceptującą: %token liczba % S : S ’+’ T | T ; T : T ’-’ W | W ; 27 W : ’(‘ S ’)’ | liczba ; Q : S {puts(”OK”);} ;

PLIK SPECYFIKACJI Generator Yacc pozwala na korzystanie ze zmiennych; Oczywiście zmienna z której chcemy skorzystać, musi być uprzednio zadeklarowana w sekcji deklaracji; Następnie może być przetwarzana, inkrementowana i zmieniana w sekcji reguł; Sposób deklaracji: typ_zmiennej nazwa_zmiennej=wartość; 28

PLIK SPECYFIKACJI Oprócz zmiennych Yacc pozwala także na używanie funkcji; Każda taka funkcja może być używana w regule przetwarzania; Należy jednak pamiętać o zdefiniowaniu funkcji. Definicja ciała funkcji znajduje się w trzeciej części pliku specyfikacji – części definicji; Funkcję definiuje się według standardów języka C; 29

Przykład Załóżmy, że mamy za zadanie napisać analizator dla języka, który składać się powinien, z tej samej liczby nawiasów otwierających co zamykających. Dodatkową trudnością niech będzie konieczność podania przez analizator liczby par nawiasów (otwierających i zamykających); Produkcje gramatyki łatwo wyznaczyć: S -> ( S ), S ->  ;

SPECYFIKACJA YACC W pliku specyfikacji dla generatora Yacc możemy również korzystać z nowych symboli leksykalnych; W pliku specyfikacji dla generatora Yacc możemy również korzystać z nowych symboli leksykalnych; Deklarację symbolu leksykalnego poprzedza słowo kluczowe %token np.. %token nazwa_symbolu; Deklarację tę należy umieścić w sekcji pierwszej pliku specyfikacji;

SPECYFIKACJA YACC W pliku specyfikacji dla generatora Yacc możemy również korzystać z wbudowanego w program Yacc nieterminala error; W pliku specyfikacji dla generatora Yacc możemy również korzystać z wbudowanego w program Yacc nieterminala error; Wbudowany nieterminal error jest bardzo przydatny przy wykrywaniu, eliminacji błędu; Można go także zastosować przy powrocie po błędzie; 32

Przykład Zmodyfikujmy nieco rozważaną poprzednio gramatykę dla języka składającego się z jednakowej liczby nawiasów, i rozważmy gramatykę dla języka którym jest niepusty ciąg liczb w nawiasach; Produkcjie tej gramatyki to: C ->(L); L->Liczba; L->L, Liczba... L->Liczba; L->L, Liczba......

KONIEC KONIEC WYKŁADU ÓSMEGO