L E X. Generator analizatorów leksykalnych

Podobne dokumenty
Generator analizatorów leksykalnych - Lex. Bartosz Bogacki.

Podstawy Kompilatorów

Analiza leksykalna i generator LEX

Podstawy Kompilatorów

KONSTRUKCJA KOMPILATORÓW

Podstawy generatora YACC. Bartosz Bogacki.

Laboratorium z użyciem analizatora leksykalnego FLEX

Analiza leksykalna 1. Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

Flex - generator analizatorów leksykalnych

Generatory analizatorów

Podstawy programowania skrót z wykładów:

Analiza leksykalna 1. Języki formalne i automaty. Dr inż. Janusz Majewski Katedra Informatyki

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Zmienne, stałe i operatory

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Struktura pliku projektu Console Application

Zadanie analizy leksykalnej

Programowanie w języku C++ Grażyna Koba

Wstęp do programowania. Wykład 1

10. Translacja sterowana składnią i YACC

Instrukcja do ćwiczenia P4 Analiza semantyczna i generowanie kodu Język: Ada

Matematyczne Podstawy Informatyki

Ćwiczenia nr 11. Translatory. Wprowadzenie teoretyczne

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Warto też w tym miejscu powiedzieć, że w C zero jest rozpoznawane jako fałsz, a wszystkie pozostałe wartości jako prawda.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Język C++ zajęcia nr 2

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

Efektywna analiza składniowa GBK

Statyczne i dynamiczne predykaty

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Podstawy programowania w języku C++

2 Przygotował: mgr inż. Maciej Lasota

Rozdział 4 KLASY, OBIEKTY, METODY

System operacyjny Linux

Podstawy programowania C. dr. Krystyna Łapin

Generator skanerów Flex

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Programy użytkowe (utilities)

Metody Kompilacji Wykład 1 Wstęp

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

Układy VLSI Bramki 1.0

Wstęp do Programowania, laboratorium 02

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

automatem skończonym niedeterministycznym (ang. nondeterministic finite automaton) M N nazywamy system:

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

Podstawy algorytmiki i programowania - wykład 4 C-struktury

JAVAScript w dokumentach HTML (1) JavaScript jest to interpretowany, zorientowany obiektowo, skryptowy język programowania.

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Skanowanie OCR w aplikacji Kancelaria Komornika. Instrukcja dla użytkownika

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Wstęp do programowania

Języki programowania obiektowego Nieobiektowe elementy języka C++

Podstawy Kompilatorów

Przedstawię teraz tzw. podstawowe symbole wyrażenia regularne (BRE, Basic Regular Expression)

Laboratorium 3: Tablice, tablice znaków i funkcje operujące na ciągach znaków. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Język C zajęcia nr 11. Funkcje

Języki programowania zasady ich tworzenia

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Definicje. Algorytm to:

Cw.12 JAVAScript w dokumentach HTML

Powtórka algorytmów. Wprowadzenie do języka Java.

lekcja 8a Gry komputerowe MasterMind

Język HDL - VERILOG. (Syntetyzowalna warstwa języka) Hardware Description Language Krzysztof Jasiński PRUS PRUS

Wstęp do programowania

Języki programowania. Przetwarzanie tablic znaków. Część druga. Autorzy Tomasz Xięski Roman Simiński

Ilość cyfr liczby naturalnej

Podstawy programowania

Szablony klas, zastosowanie szablonów w programach

Programowanie w Ruby

Programowanie w języku Python. Grażyna Koba

Jerzy Nawrocki, Wprowadzenie do informatyki

4. Funkcje. Przykłady

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

29. Poprawność składniowa i strukturalna dokumentu XML

1 Podstawy c++ w pigułce.

Wprowadzenie do kompilatorów

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

AHDL - Język opisu projektu. Podstawowe struktury języka. Komentarz rozpoczyna znak i kończy znak %. SUBDESIGN

Proste algorytmy w języku C

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Wstęp do Informatyki i Programowania Laboratorium: Lista 0 Środowisko programowania

Algorytmika i Programowanie VBA 1 - podstawy

Mathcad c.d. - Macierze, wykresy 3D, rozwiązywanie równań, pochodne i całki, animacje

Podstawy Programowania Podstawowa składnia języka C++

Operacje wejścia/wyjścia (odsłona druga) - pliki

Bash - wprowadzenie. Bash - wprowadzenie 1/39

Podstawy Kompilatorów

Ada-95. Dariusz Wawrzyniak

Operacje wejścia/wyjścia odsłona pierwsza

Powtórka algorytmów. Wprowadzenie do języka Java.

Transkrypt:

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 G C C scan.c scan.exe WYNIK plik.txt 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<stdio.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 printf( W słowie A trzeci symbol od końca jest równy a ); 11

WYRAŻENIA REGULARNE 1. 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 1. Powtarzanie symbolu: a{n} powtórzenie symbolu a n razy; a{n,m} zakres powtarzania symbolu (czyli a n,,a m ); () określają stopień ważności (c(a d) (e+) ); 14

WYRAŻENIA REGULARNE 1. 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 1. 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 printf( W słowie A trzeci symbol od końca jest równy a ); Powinniśmy wpisać: (a b)*a(a b)*a(a b) b){2} printf( W słowie A trzeci symbol od końca jest równy a ); 17

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}) 22 ([0-9]{4} (\- \.) [0-9]{2} (\- \.) [0-9]{2})

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<stdio.h> int yylex(); %} identyfikator [Ii] [Ff] %% {identyfikator} {printf( 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...

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

LEWY KONTEKST Przetwarzając dane wejściowe może pojawic się potrzeba wykorzystania informacji o pewnym kontekście w ramach którego zachodzi dopasowanie; Możemy wyróżnic lewy kontekst (zwany inaczej stanem) i prawy kontekst; Aby móc korzystac ze stanu należy go najpierw zadeklarowa w sekcji definicji %s <nazwa_stanu> 38

LEWY KONTEKST Następnie aby zmienic stan w analizatorze należy wykonac instrukcję BEGIN <nazwa_stanu>; Różne implementacje programu LEX stosują różne oznaczenia stanu początkowego. <0> (np. w MKS LEX) <INITIAL> (np. w GNU FLEX) 39

LEWY KONTEKST %{ %} %s nazwa_stanu %% <nazwa_stanu>\ BEGIN <INITIAL>; <nazwa_stanu>. ; \ nazwa_stanu; BEGIN 40

PRAWY KONTEKST Prawy kontekst jest operatorem podglądu; Pozwala on na spojrzenie w przód strumienia danych wejściowych; [0-9]+. [0-9]*/[^0-9.] {puts( REAL );} 41

KONIEC KONIEC WYKŁADU TRZECIEGO