Generator analizatorów leksykalnych

Slides:



Advertisements
Podobne prezentacje
Techniki kompilacji Wykład I.
Advertisements

C++ wykład 9 ( ) Szablony.
Język C/C++ Funkcje.
Programowanie obiektowe
Programowanie obiektowe
Język ANSI C Funkcje Wykład: Programowanie komputerów
Wprowadzenie do C++ Zajęcia 2.
Filip Andrzejewski Remigiusz Chiluta
Języki programowania C++
formatowanie kodu źródłowego
Generator analizatorów składniowych
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
Programowanie imperatywne i język C Copyright, 2004 © Jerzy R. Nawrocki Wprowadzenie.
Kurs Pascala – spis treści
1 Dygresja: cztery płyty główne…. 2 Dygresja: osobliwości C /* cos o nieistniejacym typie Boolean */ /* oraz o operatorze przecinkowym */ #include int.
Podstawy programowania PP – WYK2 Wojciech Pieprzyca.
Podstawy programowania
Java – programowanie obiektowe
PHP wprowadzenie.
#include #include main () { cout
AWK Zastosowania Informatyki Wykład 1 Copyright, 2003 © Adam Czajka.
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
Instytut Tele- i Radiotechniczny WARSZAWA
Programowanie strukturalne i obiektowe
KONSTRUKCJA KOMPILATORÓW WYKŁAD WYKŁAD Robert Plebaniak Robert Plebaniak.
Funkcje w Pascalu Przypomnienie wiadomości o procedurach Prowadzący: Anna Kaleta Piotr Chojnacki.
Podstawy programowania. Język C i C++– podstawy Temat: 1
Podstawy programowania w języku C i C++
Wprowadzenie do programowania w językach C i C++
Generator analizatorów składniowych
Przekazywanie argumentów
Pętla do ... While C++ Źródło:
Pliki tekstowe – A. Jędryczkowski © 2007 Turbo Pascal umożliwia wykorzystanie w programach plików tekstowych. Pliki takie zawierają informację niezakodowaną
Programowanie strukturalne i obiektowe
Programowanie obiektowe – zastosowanie języka Java SE
5 Etapów Pracy Kompilatora
Maszyna wirtualna ang. virtual machine, VM.
Przekazywanie parametrów do funkcji oraz zmienne globalne i lokalne
Składnia pętli do … while do instrukcja while (wyrażenie); gdzie: instrukcja – instrukcja pojedyncza lub blok instrukcji wyrażenie – wyrażenie przyjmujące.
Wprowadzenie do CSS Okiełznać style.
Podstawy języka Instrukcje - wprowadzenie
Programowanie strukturalne i obiektowe C++
Podstawy programowania
Programowanie strukturalne i obiektowe C++
C++.
K URS JĘZYKA C++ – WYKŁAD 10 ( ) Szablony.
Programowanie strukturalne i obiektowe C++
Programowanie strukturalne i obiektowe C++
Programowanie strukturalne i obiektowe C++ Powtórzenie wiadomości z C++ Robert Nowak.
REGUŁY ZABEZPIECZEŃ W APLIKACJI OeBS Przedmiot i zakres szkolenia Przedmiot i zakres szkolenia Przedmiot i zakres szkolenia Przedmiot i zakres szkolenia.
Języki formalne i gramatyki Copyright, 2005 © Jerzy R. Nawrocki Teoretyczne podstawy.
Formatowanie dokumentów
PHP. PHP obiektowy, skryptowy język programowania zaprojektowany do generowania stron internetowych w czasie rzeczywistym.
ANALIZA SKŁADNIOWA.
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)
Podstawy programowania
Podsumowanie wiedzy MPDI2 sem.3 INFORMATYKA. tworzenie nowego pliku i katalogu, nawigacja po katalogach, listowanie zawartości katalogu, zmiana nazw,
Seminarium Dyplomowe: Metodyka i Techniki Programowania Autor: Bartłomiej Fornal.
Dokumentacja programu komputerowego i etapy tworzenia programów.
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.
Aplikacje internetowe XML Paweł Lenkiewicz. Aplikacje internetowe – XML2 eXtensible Markup Language Uniwersalny język opisu danych Często używany we współpracy.
Programowanie strukturalne i obiektowe Klasa I. Podstawowe pojęcia dotyczące programowania 1. Problem 2. Algorytm 3. Komputer 4. Program komputerowy 5.
Podstawy tworzenia skryptów
Wskaźniki Elżbieta Labocha.
Programowanie obiektowe – zastosowanie języka Java SE
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:

Generator analizatorów leksykalnych L E X Generator analizatorów leksykalnych

GENERATOR L E X Zadaniem generatora LEX jest wygenerowanie kodu źródłowego analizatora leksykalnego (domyślnie) w języku C; Kod źródłowy generowany jest przez LEX’a w oparciu o plik zawierający wszystkie reguły przetwarzania; Plik z regułami tworzony jest przez samego użytkownika; 2

GENERATOR L E X Schemat organizacji działania LEX’a: scan.l L E X scan.c G C C scane.exe plik.txt WYNIK 3

GENERATOR L E X flex –l scan.l (użycie generatora LEX) gcc scan.c -o scan.exe (kompilacja C++) scan.exe < plik.txt (analiza plik.txt) 4

GENERATOR L E X 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 leksykalny do innych aplikacji. Funkcja o której mowa to yylex(); 5

TWORZENIE PLIKU REGUŁ Każdy plik ze specyfikacją dla programu LEX 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; 6

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

TWORZENIE PLIKU REGUŁ Przykład budowy sekcji definicji: %{ #include<iostream.h> int zmienna; int yylex(); int zmienna_druga=1; %} 8

TWORZENIE PLIKU REGUŁ 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 napotyka na określony „problem” (symbol); 9

TWORZENIE PLIKU REGUŁ Budowa reguły przetwarzania opiera się na dwóch zasadniczych częściach: wzorca i operacji; Jej budowa wygląda więc: wzorzec operacja Wzorzec jest zapisywany jako wyrażenie regularne; Operacja jest blokiem instrukcji języka C; 10

TWORZENIE PLIKU REGUŁ Przykład budowy reguły przetwarzania: (a+b)*a(a+b)2 cout<<‘’W słowie A trzeci symbol od końca jest równy a’’; 11

WYRAŻENIA REGULARNE Podamy teraz kilka symboli używanych do zapisu wyrażeń regularnych występujących we wzorcach reguł przetwarzania: Symbole linii: ^… - początek linii; …$ - koniec linii; 12

WYRAŻENIA REGULARNE Symbole operacji logicznych: ab - konkatenacja; a|b - alternatywa; a* - domknięcie zwrotne (domknięcie); a+ - domknięcie dodatnie (domknięcie po odjęciu słowa pustego); a? – opcjonalność (symbol „a” nie występuje lub występuje jeden raz); 13

WYRAŻENIA REGULARNE Powtarzanie symbolu: a{n} – powtórzenie symbolu „a” n – razy; a{n,m} – zakres powtarzania symbolu (czyli an,…,am); () – określają stopień ważności (c(a|d)|(e+) ); 14

WYRAŻENIA REGULARNE Klasy znaków: [a-z] - oznacza dowolny znak z zakresu od małej litery „a” do małej litery „z”; [^a-z] – oznacza dowolny znak spoza klasy [a-z] (jak gdyby „negacja” zakresu); [a-zXY] – oznacza dowolny znak z zakresu [a-z] lub wielką literę X lub Y; [0-9] – oznacza dowolną cyfrę od 0 do 9;

WYRAŻENIA REGULARNE Klasy znaków (c.d.): . - oznacza dowolny znak nie będący znakiem końca linii; \... – poprzedza sekwencje specjalne (podobnie jak w C) np.: \n – oznacza znak końca linii; \t – oznacza znak tabulatora; 16

TWORZENIE PLIKU REGUŁ Przykład budowy reguły przetwarzania: (a+b)*a(a+b)2 cout<<‘’W słowie A trzeci symbol od końca jest równy a’’; Powinniśmy wpisać: (a|b)*a(a|b){2} cout<<‘’W słowie A trzeci symbol od końca jest równy a’’; 17

WYRAŻENIA REGULARNE Inne ważne zasady tworzenia wzorców: Wzorce zawierające spacje ujmuje się w cudzysłów; Komentarz wpisuje się między znaczniki /* a */; Niedopasowane znaki są przepisywane na wyjście; 18

Przykład Wyrażenie regularne akceptujące adres strony internetowej: [Ww]{3} \. [A-Za-z0-9._-]+ \. [A-Za-z]{3} \. [Pp] [Ll] 19

Przykład Wyrażenie regularne akceptujące słowa kluczowe w Adzie begin i end: [A-Za-z]{3,5} [A-Za-z]{5} | [A-Za-z]{3} [Bb][Ee][Gg][Ii][Nn] | [Ee][Nn][Dd] 20

Przykład Wyrażenie regularne akceptujące wszelkie identyfikatory (zmienne, stałe ) w C: [A-Za-z _ ] [A-Za-z0-9 _ ]* 21

Przykład Wyrażenie regularne akceptujące datę: ([0-9]{2} \- [0-9]{2} \- [0-9]{4}) | ([0-9]{2} \. [0-9]{2} \. [0-9]{4}) | ([0-9]{4} \- [0-9]{2} \- [0-9]{2}) | ([0-9]{4} \. [0-9]{2} \. [0-9]{2}) ([0-9]{2} (\- | \.) [0-9]{2} (\- | \.) [0-9]{4}) | ([0-9]{4} (\- | \.) [0-9]{2} (\- | \.) [0-9]{2}) 22

Przykład Wyrażenie regularne akceptujące wszelkie adresy poczty e-mail: [A-Za-z0-9 . _ -]+@[A-Za-z0-9 . _ ]+\.[A-Za-z]{2,4} 23

TWORZENIE PLIKU REGUŁ Trzecią sekcją składową pliku ze specyfikacją dla programu LEX jest sekcja podprogramów; W skład sekcji podprogramów mogą, jak sama nazwa wskazuje, wchodzić definicje funkcje, które będą następnie wykorzystywane przez analizator leksykalny; 24

TWORZENIE PLIKU REGUŁ Deklaracja funkcji wchodzących w skład tej sekcji poddana jest regułą tworzenia funkcji w języku C; Funkcja yywrap() – jest to funkcja o specjalnym znaczeniu. Gdy wywołujemy (uprzednio wygenerowany) analizator leksykalny, funkcja yywrap() jest wykonywana zawsze po przetworzeniu danych wejściowych; 25

Przykład Przykład funkcji znajdującej się w sekcji podprogramów: int main() { return yylex(); } Wymaga ona oczywiście wcześniejszej deklaracji yylex’a w postaci zwrotu: int yylex(); 26

TWORZENIE PLIKU REGUŁ Przy tworzeniu pliku reguł przetwarzania można korzystać z zmiennych globalnych; Deklaracja tego typu zmiennych znajduje się w pierwszej sekcji (sekcji definicji) pliku; Zmienne globalne, mogą być oczywiście wykorzystywane w każdej następnej sekcji, np. inkrementowane, zmieniane, czy odczytywane; 27

TWORZENIE PLIKU REGUŁ Oprócz zmiennych globalnych można także korzystać ze zmiennych wbudowanych; Mamy dwie szczególnie ważne zmienne wbudowane yyleng i yytext; Zmienna yyleng jest typu int i okresla długość dopasowania; Zmienna yytext jest znakiem (char) a dokładniej ciągiem znaków, wskazuje na leskem (odnajduje w strumieniu danych wejściowych, zapis który pasował do wzorca); 28

TWORZENIE PLIKU REGUŁ Pożyteczną rolę odgrywają także definicje regularne; Tworzenie definicji regularnej to inaczej przypisanie wyrażeniu regularnemu pewnego identyfikatora; Identyfikator ten może być wykorzystany później w polu wzorca; Definicja regularna jest tworzona w sekcji definicji; 29

Przykład Definicje regularną umieszczamy co prawda w sekcji definicji, jednakże po bloku bezpośrednio przepisywanym do analizatora; Zobaczmy następujący przykład, który pokazuje sposób korzystania z zadeklarowanego identyfikatora; 30

Przykład %{ #include<iostream.h> int yylex(); %} identyfikator [Ii] [Ff] %% {identyfikator} {cout<<‘’ Wczytano leksem IF’’;} 31

TWORZENIE PLIKU REGUŁ Wszystkie trzy omówione sekcje składowe pliku ze specyfikacją dla programu LEX oddzielane są podwójnym znakiem procenta - %%; Schemat pliku ze specyfikacją reguł dla programu LEX możemy więc zademonstrować w tabeli: 32

TWORZENIE PLIKU REGUŁ SEKCJA DEFINICJI %% SEKCJA REGUŁ PRZETWARZANIA SEKCJA PODPROGRAMÓW ... 33

NIEJEDNOZNACZNOŚĆ Gdy przeanalizowaliśmy już zasadę działania generatora LEX, możemy przyjrzeć się istotnemu problemowi niejednoznaczności przy działaniu LEX; Przykład: m* {cout<<‘’*’’;} mmm {cout<<‘’+’’;} Dostarczamy strumień danych postaci: mmmmmmmmmm;mmm 34

NIEJEDNOZNACZNOŚĆ ZASADA NAJDŁUŻSZEGO DOPASOWANIA – określa, iż jeśli mamy dwie lub więcej reguł dla których wzorce są spełnione, to wybierana jest ta reguła dla której dopasowanie wzorca jest najdłuższe; ZASADA WCZEŚNIEJSZEGO DOPASOWANIA – mówi iż, gdy dopasowania maja identyczną długość, wybrana jest reguła, która została umieszczona pierwsza w pliku specyfikacji; 35

NIEJEDNOZNACZNOŚĆ Stosując zatem zasadę pierwszą w przykładzie, dane wyjściowe będą wyglądały: *;+ Gdybyśmy zaś mieli dane wejściowe postaci mmm to stosując drugą zasadę dostaniemy na wyjściu + 36

RETRAKCJA Pojęcie retrakcji wiąże się ze sposobem działania analizatora; Analizator przetwarza wiele wzorców równolegle w poszukiwaniu najlepszego (tzn. najdłuższego) . Porzuca on z czasem wzorce mniej „obiecujące” koncentrując się na wzorcach, które mogą dać dłuższe dopasowania; W sytuacji niepowodzenia wraca do porzuconych wzorców;... 37

KONIEC KONIEC WYKŁADU TRZECIEGO