Włączenie analizy leksykalnej do analizy składniowej jest nietrudne; po co więc jest wydzielona?

Podobne dokumenty
Uproszczony schemat działania kompilatora

Uproszczony schemat działania kompilatora

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

Metody Kompilacji Wykład 7 Analiza Syntaktyczna

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

Wykład 5. Jan Pustelnik

Metody Kompilacji Wykład 1 Wstęp

Analizator syntaktyczny

Definiowanie języka przez wyrażenie regularne(wr)

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

Metodologie programowania

10. Translacja sterowana składnią i YACC

Plan wykładu. Kompilatory. Literatura. Translatory. Literatura Translatory. Paweł J. Matuszyk

Matematyczne Podstawy Informatyki

Zadanie analizy leksykalnej

Gramatyka operatorowa

Wprowadzenie do analizy składniowej. Bartosz Bogacki.

Metody Kompilacji Wykład 3

Wykład5,str.1. Maszyny ze stosem ... 1,0 λ r. λ,z λ

Gramatyki rekursywne

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

Program We Kompilator Wy Źródłowy

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

Translacja wprowadzenie

Analiza metodą zstępującą. Bartosz Bogacki.

Obiektowa implementacja parsera klasy LL(1)

Wprowadzenie do kompilatorów

GRAMATYKI BEZKONTEKSTOWE

3.4. Przekształcenia gramatyk bezkontekstowych

kiedy znowu uzyska sterowanie, to podejmuje obliczenie od miejsca, w którym poprzednio przerwała, i z dotychczasowymi wartościami zmiennych,

Semantyka i Weryfikacja Programów - Laboratorium 6

Wykład 10. Translacja sterowana składnią

Podstawy generatora YACC. Bartosz Bogacki.

Przegląd metod error recovery (dla parsingu top-down, przykłady)

Opis wzorców polegający na na wykorzystaniu modelu definicji rekurencyjnych, nazywamy gramatyką bezkontekstową (ang. contex-free grammar).

Generatory analizatorów

Metody Kompilacji Wykład 13

Teoretyczne podstawy informatyki. Wykład 12: Gramatyki. E. Richter-Was 1

KONSTRUKCJA KOMPILATORÓW

Gramatyki atrybutywne

Generator YACC: gramatyki niejednoznaczne

Języki programowania zasady ich tworzenia

JIP. Analiza składni, gramatyki

Gramatyki regularne i automaty skoczone

Matematyczne Podstawy Informatyki

Algorytm - pojęcie algorytmu, sposób zapisu, poziom szczegółowości, czynności proste i strukturalne. Pojęcie procedury i funkcji.

Efektywna analiza składniowa GBK

Generator LLgen. Wojciech Complak Generator LLgen - charakterystyka. Generator LLgen -składnia specyfikacji

Języki formalne i automaty Ćwiczenia 2

Lingwistyka Matematyczna Języki formalne i gramatyki Analiza zdań

JĘZYKIFORMALNE IMETODYKOMPILACJI

Analiza semantyczna. Gramatyka atrybutywna

Algorytmy zwiazane z gramatykami bezkontekstowymi

Programowanie w Logice Gramatyki metamorficzne. Przemysław Kobylański na podstawie [CM2003] i [SS1994]

Automat ze stosem. Języki formalne i automaty. Dr inż. Janusz Majewski Katedra Informatyki

JAO - Wprowadzenie do Gramatyk bezkontekstowych

Języki formalne i gramatyki

Języki formalne i automaty Ćwiczenia 4

Java EE produkcja oprogramowania

Algorytmy i struktury danych. Drzewa: BST, kopce. Letnie Warsztaty Matematyczno-Informatyczne

Błędy leksykalne są na ogół nietrudne do znalezienia.

Analiza leksykalna i generator LEX

JAO - lematy o pompowaniu dla jezykow bezkontekstowy

ZYKI BEZKONTEKSTOWE (KLASA

Generator YACC: gramatyki niejednoznaczne

Gramatyki (1-2) Definiowanie języków programowania. Piotr Chrząstowski-Wachjtel

ZAAWANSOWANE JĘZYKI PROGRAMOWANIA

Translacja sterowana składnią w metodzie zstępującej

5. JĘZYKI BEZKONTEKSTOWE (KLASA "2") GRAMATYKI BEZKONTEKSTOWE AUTOMATY ZE STOSEM DETERMINISTYCZNE JĘZYKI BEZKONTEKSTOWE I

Programowanie komputerów

1 Wskaźniki i listy jednokierunkowe

SYLABUS DOTYCZY CYKLU KSZTAŁCENIA Bieżący sylabus w semestrze zimowym roku 2016/17

Podstawy kompilatorów. Generator LLgen. Wojciech Complak.

Przyczyny dwustopniowego tłumaczenia

Języki i gramatyki formalne

Hierarchia Chomsky ego Maszyna Turinga

MATERIAŁY DO ZAJĘĆ I. Podstawowe pojęcia. Algorytm. Spis treści Przepis

JĘZYKI FORMALNE I METODY KOMPILACJI

Wprowadzenie do programowania języki i gramatyki formalne. dr hab. inż. Mikołaj Morzy

Bison - generator analizatorów składniowych

Wybrane narzędzia do tworzenia analizatorów leksykalnych i składniowych w Javie

Semantyka i Weryfikacja Programów - Laboratorium 3

Języki formalne i automaty Ćwiczenia 8

Wprowadzenie. Wojciech Complak

O ALGORYTMACH I MASZYNACH TURINGA

Zadanie 1. Czy prawdziwa jest następująca implikacja? Jeśli L A jest językiem regularnym, to regularnym językiem jest też. A = (A, Q, q I, F, δ)

Zapis algorytmów: schematy blokowe i pseudokod 1

Podstawy programowania

PARADYGMATY I JĘZYKI PROGRAMOWANIA. Analiza leksykalna i syntaktyczna. w- 5

Rodzaje błędów w programach. Wykład9.UWAGIOGÓLNE,str.1

11 Probabilistic Context Free Grammars

JĘZYKI FORMALNE I METODY KOMPILACJI

Algorytmy od problemu do wyniku

Języki formalne i automaty Ćwiczenia 9

ForPascal Interpreter języka Pascal

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

11. Wzmianka o metodach definiowania semantyki przypomnijmy definicję matematyczną języka formalnego: L = <Σ, Syn, DSem, Sem>

INFORMATYKA W SZKOLE. Podyplomowe Studia Pedagogiczne. Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227

Paradygmaty i języki programowania. Analiza leksykalna Skaner, RE, DAS, NAS, ε- NAS

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

Transkrypt:

Po co wydziela się analizę leksykalną? Wykład7,str1 Włączenie analizy leksykalnej do analizy składniowej jest nietrudne; po co więc jest wydzielona? 1 Analiza leksykalna jest prostsza niż składniowa leksyka syntaktyka gramatyka prawoliniowa bezkontekstowa akceptor automat maszyna stosowa 2 Analizator leksykalny czyta tekst, więc jego działanie zajmuje dużo czasuwartowięcgooptymalizować atorobisięinaczejniżw składniowym 3 Czytanie tekstu jest zależne od platformy, analiza składniowa jest niezależna Rozdzielenie ich poprawia więc przenośność(portability) kompilatorów Uproszczony schemat kompilacji Wykład7,str2 program źródłowy ciąg leksemów drzewo wywodu drzewo i tablice symboli analiza leksykalna analiza syntaktyczna analiza semantyczna KOMPILATOR generacja kodu dane do programu kod docelowy wyniki

Uproszczony schemat kompilacji Wykład7,str3 ciąg leksemów drzewo wywodu analiza syntaktyczna KOMPILATOR Różne metody analizy syntaktycznej Wykład7,str4 Rozbiór słowa budowanie jego drzewa wywodu w danej gramatyce bezkontekstowej Synonimy: rozbiór = analiza syntaktyczna = parsing Parser program(procedura, podprogram) dokonujący rozbioru Budowy drzewa wywodu można dokonywać albo od strony korzenia(rozbiór zstępujący), albo od strony liści(rozbiór wstępujący) Jest wiele metod rozbioru danego słowa; różnią się zakresem stosowalności(do jakich rodzajów gramatyk bezkontekstowych się nadają), oraz efektywnością(jak szybko działają i ile potrzebują pamięci) Programy do automatycznego tworzenia parserów potrafią na ogół dobrać optymalny(albo przynajmniej niezły) parser do danej gramatyki

Koszty Wykład7,str5 Do każdej jednoznacznej gramatyki bezkontekstowej można zbudowaćparser,działającywczasieo(n 3 ),gdzienjestdługościąciągu terminali na wejściu Ta złożoność wynika z działania przez próbowanie i wycofywanie się w przypadku złego dopasowania; drzewo wywodu jest wielokrotnie budowane i niszczone Niezbyt bolesne ograniczenia na gramatyki umożliwiają istnienie parsera, działającego w czasie O(n), czyli znacznie szybciej Wszystkie praktycznie stosowane parsery działają w czasie O(n) Rekursywny parser zstępujący Wykład7,str6 Analiza top-down Po jednej funkcji rekursywnej dla każdego nieterminala Funkcja dla nieterminalu X wywoływana jest po to, żeby skonstruować drzewo wywodu początkowych leksemów z wejścia, mające w korzeniu nieterminal X ; żeby móc zadecydować, której produkcji z nieterminalu X użyć, jest wywoływana w sytuacji, w której znany(wczytany) jest już pierwszy liść(leksem) tego drzewa; kończy działanie w sytuacji, kiedy znany jest już pierwszy leksem spoza korony tego drzewa; może zasygnalizować błąd i program ją wywołujący stara się znaleźć inną produkcję do zastosowania

Rekursywny parser zstępujący Wykład7,str7 Boolean B(drzewo* drz) { drzewo drz1; if(nowyleks( w )) if(b(&drz1)){ *drz=; return true; else { *drz=; return true; else return false; Boolean A(drzewo* drz); Boolean B(drzewo* drz); B ::=w B w w B B drz1 B w Rekursywny parser zstępujący Wykład7,str8 Boolean A(drzewo* drz) { drzewo drz1, drz2; if(nowyleks( y )) if(a(&drz1)) if(b(&drz2)) if(nowyleks( z )) { *drz=; return true; else blad("brakuje terminalu z"); else blad("brakuje nieterminalu <B>"); else blad("brakuje nieterminalu <A>"); else if(nowyleks( x )) { *drz=; return true; else return false; Boolean A(drzewo* drz); Boolean B(drzewo* drz); A ::=y A B z x y A x A A B drz1 drz2 z

Wykład7,str9 Przekształcenie gramatyki dla parsera zstępującego Zmiana kolejności produkcji i wyłączenie przed nawias : W ::= S S + W S - W S ::= C C * S C / S C ::= L ( W ) L ::=0 1 0 L 1 L W ::= S { + W - W λ S ::= C { * S / S λ C ::=( W ) L L ::=0 { L λ 1 { L λ Programowanie parsera zstępującego Wykład7,str10 W ::= S S + W S - W W ::= S { + W - W λ Booleanf W (drzewo*t) { if(f S (&t 1 )) if(nowyleks( +,&nleks) nowyleks( -,&nleks)) { if(f W (&t 2 )) {*t= W S W ; returntrue; t 1 nleks t2 else blad("po+lub-niema W "); else {*t= W S t 1 else return FALSE; ; returntrue; Uwaga: To jeszcze nie jest dokładnie to, co trzeba Patrz dalej

Parser zstępujący problemy Wykład7,str11 Lewostronna rekursja w gramatyce powoduje nieskończone obliczenie Przykład: innagramatyka: W ::= S W + S M BooleanfW (drzewo*t) { if(f S (&t 1 )) { *t= W S ; return TRUE; else t 1 if(f W (&t 1 )) { if(nowyleks( +,&nleks)) if(f S (&t 2 )) { *t= W W S ; returntrue; t 1 + t2 else blad("po + brakuje <S>"); else return FALSE; else return FALSE; Leczenie lewostronnej rekursji Wykład7,str12 Problem: produkcje gramatyczne postaci N ::= N (czyli lewostronnie rekursywne) prowadzą do zapętlenia parsera zstępującego Takie produkcje potrzebne są dla często spotykanej w składni języków programowania konstrukcji ciąg grupowany do lewej Przykład: M liczba ::= cyfra cyfra liczba 345=345=3 10 2 +45 ciąg cyfr grupowany do prawej(nie ma problemu) liczba ::= cyfra liczba cyfra ciąg cyfr grupowany do lewej(jest problem) 345=345=34 10+5

Leczenie lewostronnej rekursji Wykład7,str13 Wyjście: do gramatyk wprowadzić specjalną konstrukcję oznaczającą ciąggrupowanydolewej : Przykład: MŻeby wyrazić liczba to niepusty ciąg cyfr grupowany do lewej zamiast piszemy liczba ::= cyfra liczba cyfra liczba ::= cyfra cyfra liczba cyfra Leczenie lewostronnej rekursji Wykład7,str14 Wyjście: do gramatyk wprowadzić specjalną konstrukcję oznaczającą ciąggrupowanydolewej : Przykład: MŻeby wyrazić wyrażenie to niepusty ciąg składników porozdzielanych plusami i minusami grupowany do lewej zamiast wyrażenie ::= składnik wyrażenie + składnik wyrażenie składnik piszemy wyrażenie ::= składnik {{ + składnik wyrażenie składnik +

Leczenie lewostronnej rekursji Wykład7,str15 Gramatyka oryginalna z lewostronną rekursją: Gramatyka wyleczona ziteracją: W ::= S W + S S W - S S ::= C S * C C S / C C ::= L ( W ) L ::=0 1 L 0 L 1 W ::= S {{ + S S ::= C {{ / C C ::=( W ) L L ::= { 0 1 { 0 1