Flex - generator analizatorów leksykalnych



Podobne dokumenty
Generatory analizatorów

L E X. Generator analizatorów leksykalnych

Podstawy Kompilatorów

Laboratorium z użyciem analizatora leksykalnego FLEX

Generator skanerów Flex

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

Analiza leksykalna i generator LEX

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

Generator analizatorów leksykalnych - Lex. Bartosz Bogacki.

Podstawy Kompilatorów

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

Zadanie analizy leksykalnej

Bison - generator analizatorów składniowych

System operacyjny Linux

Podstawy generatora YACC. Bartosz Bogacki.

Zajęcia P2AM. Analizator składniowy (Flex + Bison, Linux)

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

Wybrane narzędzia do tworzenia analizatorów leksykalnych i składniowych w C/C++ by Kapitol Team

PARADYGMATY I JĘZYKI PROGRAMOWANIA. lex/flex i yacc/bison w- 4 (2014)

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

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

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

Zasady programowania Dokumentacja

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

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

Wstęp do informatyki 2011/2012. Wyrażenia regularne (sed)

10. Translacja sterowana składnią i YACC

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

Programowanie komputerowe. Zajęcia 1

Programowanie Proceduralne

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

Podstawy Kompilatorów

1 Podstawy c++ w pigułce.

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

Algorytm. a programowanie -

Zmienne, stałe i operatory

Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.

Wstęp do Programowania, laboratorium 02

Język C zajęcia nr 11. Funkcje

Laboratorium Podstaw Informatyki Strona 1. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 2. Funkcje, operatory i wyrażenia.

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

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

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

Programowanie komputerowe. Zajęcia 3

Wstęp do wskaźników w języku ANSI C

Podstawy programowania 2. Temat: Wprowadzenie do wskaźników. Przygotował: mgr inż. Tomasz Michno

Wstęp do programowania

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

2.4 Dziedziczenie. 2.4 Dziedziczenie Przykłady programowania w C - kurs podstawowy

Skrypty powłoki Skrypty Najcz ciej u ywane polecenia w skryptach:

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

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

Zadanie 04 Ktory z ponizszych typow danych w jezyku ANSI C jest typem zmiennoprzecinkowym pojedynczej precyzji?

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Język ludzki kod maszynowy

1 Podstawy c++ w pigułce.

Sposoby wykrywania i usuwania błędów. Tomasz Borzyszkowski

Make jest programem komputerowym automatyzującym proces kompilacji programów, na które składa się wiele zależnych od siebie plików.

Tworzenie języków specyfikacji dla zagadnień numerycznych

Komentarze w PHP (niewykonywane fragmenty tekstowe, będące informacją dla programisty)

Szablony klas, zastosowanie szablonów w programach

Język C, tablice i funkcje (laboratorium, EE1-DI)

Układy VLSI Bramki 1.0

Parsery LL(1) Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

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

Ilość cyfr liczby naturalnej

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

Język C, tablice i funkcje (laboratorium)

Ćwiczenia nr 11. Translatory. Wprowadzenie teoretyczne

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Podstawy programowania w języku C++

4. Funkcje. Przykłady

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Laboratorium 1. Programowanie II - Kierunek Informatyka. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej

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

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

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

Translacja sterowana składnią w generatorze YACC

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

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Podstawy i języki programowania

Argumenty wywołania programu, operacje na plikach

Podstawy Programowania C++

Język Python (2) Język Python (2) 1/36

RPC. Zdalne wywoływanie procedur (ang. Remote Procedure Calls )

Autor: mgr inż. Sławomir Samolej. Zagadnienie 1. (instrukcja wyboru: switch)

Lab 10. Funkcje w argumentach funkcji metoda Newtona. Synonimy nazw typów danych. Struktury. Tablice struktur.

Laboratorium 6: Ciągi znaków. mgr inż. Leszek Ciopiński dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Projektowanie Scalonych Systemów Wbudowanych VERILOG

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ć

Wykład X. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2016 Janusz Słupik

Języki formalne i automaty Ćwiczenia 9

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

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.

Opis podstawowych funkcji PC- SHELLa

Program We Kompilator Wy Źródłowy

Metody Kompilacji Wykład 8 Analiza Syntaktyczna cd. Włodzimierz Bielecki WI ZUT

1. Wprowadzenie do C/C++

Transkrypt:

Flex - generator analizatorów leksykalnych Spis treści: 1. Wprowadzenie Wyrażenia regularne Schemat specyfikacji Prosty przykład Uruchomienie Makefile 2. Rozstrzyganie niejednoznaczności 3. Rozpoznawanie kontekstu 4. Stany 5. Predefiniowane zmienne i funkcje 6. Inne materiały Wprowadzenie Flex jest generatorem analizatorów leksykalnych (skanerów). Usiłując opisać flex-a w kilku zdaniach można powiedzieć, że: flex przyjmuje na wejściu opis w formie wyrażeń regularnych, flex konstruuje na podstawie podanych wyrażeń regularnych automat skończony, flex produkuje kod skanera w języku C (lub C++), wygenerowny przez flexa program pozwala wykrywać w strumieniu wejściowym ciągi znaków zgodne ze wzorcami określonymi przez wyrażenia regularne i wykonywać zadane akcje po rozpoznaniu wzorca. Działanie flex-a jest schematycznie przedstawione na rysunku: Wyrażenia regularne Poniżej zaprezentowany jest zbiór wyrażeń regularnych udostępniach przez flex-a. Wyrażenie Obejmuje Przykład c dowolny znak nie będący operatorem a \c zwykłe znaczenia znaku \* "s" ciąg znaków "**". dowolny znak z wyjątkiem znaku nowej linii a.b ^ początej linii ^początek $ koniec linii koniec$ [s] dowolny znak ze zbioru [0123abc] [^s] dowolny znak nie będący w zbiorze [^0123abc] [s 1 -s 2 ] dowolny znak ze zbioru s 1 -s 2 [0-9] r* zero badź więcej wystąpień wyrażenia r a* r+ jedno badź więcej wystąpień wyrażenia r a+ r? zero bądź jedno wystąpienie wyrażenia r a? r{n,m od n do m wystąpień wyrażenia r a{1,5 r{m dokładnie m wystąpień wyrażenia r a{5 r 1 r 2 wyrażenie r 1 a następnie r 2 ab

r 1 r 2 wyrażenie r 1 lub r 2 a b (r) wyrażenie r (a b) r 1/ r 2 wyrażenie r 1 gdy następuje po nim r 2 a/b <x> r wyrażenie r pod warunkiem przebywania w stanie x <x>abc Przykłady: Wyrażenie regularne Akceptowane ciągi znaków flex flex [0-9][^0-9] 2a, 3%, 5m L(R[0-9] L[0-9]) LR1, LL0 "-"?1-1, 1 0x[0-9A-F]+ 0xFF DD" "[0-9]{7 DD 3452378 Schemat specyfikacji Specyfikacja (wejście) dla flex-a to najczęściej plik z rozszerzeniem.l, np. example.l. Specyfikacja ma następujący układ: definicje pomocnicze reguły podprogramy pomocnicze Sekcja definicje pomocnicze umożliwiaja zdefinowanie pomocniczych nazw dla złożonych wyrażeń regularnych oraz podanie kodu, który będzie bezpośrdnio kopiowany na początek kodu skanera. Sekcja reguły zawiera wyrażenia regularnym wraz z przypisanymi im akcjami w języku C (lub C++). Sekcja podprogramy pomocnicze umożliwia podanie kodu, który ma być skopiowany bezpośrednio na koniec pliku skanera. Prosty przykład Poniżej przedstawiony jest specyfikacja flexa dla skanera, który wyszukuje ciąg znaków lex i zamienia go na ciąg znaków flex. /* Program wyszukuje ciag znakow "lex" i zamienia go na ciag znakow "flex" */ lex printf("flex"); main() { printf("zamiana lex na flex:\n"); yylex(); return 0; Źródła: zamien.l Uruchomienie

Aby wygenerować kod skanera wpisujemy: flex zamien.l Otrzymany w ten sposób kod należy skompilować: gcc lex.yy.c -o zamien -lfl Skaner można uruchomić z przykladowym plikiem testowym test_zamien:./zamien <test_zamien Makefile Przykładowy Makefile: PROG = example all : ${PROG lex.yy.c: ${PROG.l flex ${PROG.l ${PROG: lex.yy.c gcc -o ${PROG lex.yy.c -lfl Źródła: Makefile Więcej informacji: http://developers.sun.com/solaris/articles/make_utility.html http://www.gnu.org/software/make/manual/html_chapter/make.html#sec_top Rozstrzyganie niejednoznaczności Gdy więcej niż jedna reguła pasuje do ciągu wejściowego flex stosuje kolejno dwie zasady: 1. Preferowany jest możliwy do uzgodnienia lexem o największej długości 2. Wśród reguł, które uzgadniają lexem o tej samej długości preferowana jest reguła, która występuje wcześniej (innymi słowy przy równej długości ciągów znaków zadziała reguła wcześniejsza w specyfikacji) begin printf("%s slowo kluczowe\n", yytext); // regula 1 [a-z]+ printf("%s identyfikator\n", yytext); // regula 2. \n /* empty */ Jeżeli na wejściu pojawi się ciąg znaków beginner, to zadziała reguła 2 i flex potraktuje ciąg znaków jako identyfikator, bo reguła begin dopasuje 5 znaków, a reguła [a-z]+ dopasuje 8 znaków. Jeżeli na wejściu pojawi się ciąg znaków begin, to zadziała reguła 1 i flex potraktuje go jako słowo kluczowe, bo obie reguły dopasowują po 5 znaków. Źródła: begin.l Rozpoznawanie kontekstu Zdarza się, że w różnych momentach analizy dla tego samego wzorca mają być

zastosowane różne akcje. Taka sytuacja wymaga rozpoznawania kontekstu przez skaner. Flex oferuje następujące metody rozpoznawania kontekstu: użycie operatorów kontekstu ^, $ i / ^ - początek linii, $ - koniec linii, / - prawy kontekst. /* passwd.l Analiza zawartosci pliku passwd */ ^ewa printf("uzytkownik ewa ma konto w systemie\n"); :$ printf("uzytkownik nie ma zdefiniowanego shell-a\n");. \n ; Źródła: passwd.l test_passwd /* shutdown.l dopasowuje ciag shut, jezeli wystapi po nim ciag down */ shut/down printf("%s\n", yytext);. \n /* empty */ Stany Źródła: shudown.l Do rozpoznawania lewego kontekstu można wykorzystać również stany startowe. Zilustrowano to poniżej. Przykład użycia stanów startowych /* jaguar1.l Rozpoznawanie znaczenia slowa jaguar w zaleznosci od lewego kontekstu przy uzyciu stanow */ %s A B ^a BEGIN(A); ^b BEGIN(B); <A>jaguar printf("duzy kot\n"); <B>jaguar printf("sportowy samochod\n");. \n ; Źródła: jaguar1.l Ten sam przykład z użyciem flagi

/* jaguar2.l Rozpoznawanie znaczenia slowa jaguar w zaleznosci od kontekstu z wykorzystaniem flagi */ char flag; ^a ^b flag = 'a'; flag = 'b'; jaguar. \n ; switch(flag){ case 'a': case 'b': printf("duzy kot\n"); break; printf("samochod sportowy\n"); break; Źródła: jaguar2.l Flex udostępnia również stany wyłączne. W wyłącznym stanie startowym nie działają żadne reguły poza posiadającymi ten stan w prefixie. /* exclusive.l demonstruje dzialanie wylacznych stanow startowych */ %x LITERAL raz ECHO; dwa ECHO; # BEGIN(LITERAL); <LITERAL># BEGIN(INITIAL);. /* empty */ Źródła: exclusive.l test_exclusive Predefiniowane zmienne i funkcje Obiekt predefiniowany ECHO yytext yyleng yywrap() yymore() yyless(n) REJECT yyin yyout input unput(c) yylval Znaczenie przekopiowuje dopasowany ciąg znaków na wyjście dopasowany ciąg znaków długość dopasowanego ciągu znaków zwraca 1, gdy jest jeszcze coś na wejściu do przetworzenia; w przeciwnym razie zwraca 0 powoduje, że następny rozpoznany ciąg zostanie dopisany do aktualnego, w yytext otrzymamy ich konkatenację pozostawia w yytext tylko n początkowych znaków, pozostałe zwraca z powrotem na wejście oznacza: "przejdź do innego wariantu"; porzuca aktualne dopasowanie i powoduje przejście do alternatywnej reguły; aktualnie dopasowany ciąg zostaje zwrócony na wejście wejście wyjście pobiera następny znak z wejścia wypisuje znak c na wyjście zmienna globalna wykorzystywana do przekazania atrybutu tokenu przekazywanego do parsera

Przykłady: /* meta-dane.l demonstruje dzialanie funkcji yymore */ meta- ECHO; yymore(); dane ECHO; Źródła: meta-dane.l /* very_easy.l demonstruje wykorzystanie dyrektywy REJECT */ very printf("%s ",yytext); REJECT; [a-z]+ ECHO; Źródła: very_easy.l REJECT = yyless(0); /* block.l Zliczanie wystapien ciagow znakow block i lock */ int block_c, lock_c; block { block_c++; /* Po dopasowaniu ciagu block wycofaj wszystkie znaki poza pierwszym do ponownej analizy */ yyless(1); lock lock_c++; \n. /* empty */ main(){ yyout = fopen("scanner_output", "a+"); yylex(); fprintf(yyout, "block - %d, lock - %d.\n", fclose(yyout); block_c, lock_c); Źródła: block.l test_block /* pary.l Tworzy statystyke wystapien wszystkich par malych liter */ int digram [26][26]; int i, j;

[a-z][a-z] {. \n /* empty */ main(){ /* wyzeruj tablice */ for(i=0; i<26; i++) for(j=0; j<26; j++) digram[i][j] = 0; yylex(); digram[yytext[0]-97][yytext[1]-97]++; REJECT; /* wypisz tablice */ /* Drukowanie podsumowań często umieszcza się także w funkcji yywrap */ for(i=0; i<26; i++) for(j=0; j<26; j++) if (digram[i][j]!= 0) printf("%c,%c: %d\n", i+97, j+97, digram[i][j]); Źródła: pary.l Inne materiały Lex - A Lexical Analyzer Generator, M. E. Lesk, Flex - manual po polsku, Flex, version 2.5 - A fast scanner generator, Vern Paxson.