Lexikální analýza. Miroslav Beneš Dušan Kolář

Podobné dokumenty
Lexikální analýza. Rozhraní lexikálního analyzátoru. Miroslav Beneš Dušan Kolář. M. Beneš, D. Kolář: Lexikální analýza 1. Lexikální analýza 2

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LEXIKÁLNÍ ANALÝZA

Konstruktory překladačů

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE REALIZACE PŘEKLADAČE I

Poslední aktualizace: 14. října 2011

Lexikální analýza Teorie programovacích jazyků

Programovací jazyk Pascal

Konečný automat. Jan Kybic.

Lexikální analýza (Obsah)

Uplatnění metod na zvolený jazyk

Automaty a gramatiky(bi-aag) Motivace. 1. Základní pojmy. 2 domácí úkoly po 6 bodech 3 testy za bodů celkem 40 bodů

Algoritmizace a programování

Virtuální počítač. Uživatelský program Překladač programovacího jazyka Operační systém Interpret makroinstrukcí Procesor. PGS K.

Programovací jazyk. - norma PASCAL (1974) - implementace Turbo Pascal, Borland Pascal FreePascal Object Pascal (Delphi)

Regulární výrazy. Definice Množina regulárních výrazů nad abecedou Σ, označovaná RE(Σ), je definována induktivně takto:

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Interpret jazyka IFJ2011

Syntaktická analýza. Implementace LL(1) překladů. Šárka Vavrečková. Ústav informatiky, FPF SU Opava

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

Implementace LL(1) překladů

8) Jaké jsou důvody pro použití víceprůchodového překladače Dříve hlavně kvůli úspoře paměti, dnes spíše z důvodu optimalizace

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

Sémantika Tabulka symbolů Intermediální kód Typová kontrola, přetypování Statická a dynamická sémantika. Sémantická analýza.

Výpočetní modely pro rozpoznávání bezkontextových jazyků zásobníkové automaty LL(k) a LR(k) analyzátory

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Zápis programu v jazyce C#

Generování vnitřní reprezentace programu

Algoritmizace a programování

GENEROVÁNÍ KÓDU 9. SHRNUTÍ - PŘÍKLAD POSTUPU PŘEKLADU VSTUPNÍHO PROGRAMU (ZA POUŽITÍ DOSUD ZNÁMÝCH TECHNIK)

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Regulární výrazy. Vzory

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LL SYNTAKTICKÁ ANALÝZA DOKONČENÍ, IMPLEMENTACE.

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

GENEROVÁNI KÓDU jazyk Mila

: Teoretická informatika(ti)

Práce s textem. Třída Character. Třída Character. Třída Character. reprezentuje objekty zapouzdřující hodnotu typu char (boxing / unboxing)

doplněk, zřetězení, Kleeneho operaci a reverzi. Ukážeme ještě další operace s jazyky, na které je

Jazyk C Program v jazyku C má následující strukturu: konstanty nebo proměnné musí Jednoduché datové typy: Strukturované datové typy Výrazy operátory

Úvod z historie. Kompilátory. Kompilace / Kompilátor Compile / Compiler. Pojem kompilátoru. Úvod z historie

Regulární výrazy. M. Kot, Z. Sawa (VŠB-TU Ostrava) Úvod do teoretické informatiky 14. března / 20

Úvod do programovacích jazyků (Java)

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

Programovací jazyky, syntaxe, sémantika, zpsoby popisu

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Bezkontextové gramatiky. Z. Sawa (VŠB-TUO) Úvod do teoretické informatiky 6. května / 49

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Překladač a jeho struktura

Algoritmy I. Cvičení č. 2, 3 ALGI 2018/19

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky -

- jak udělat konstantu long int: L long velka = 78L;

Automaty a gramatiky(bi-aag) Formální překlady. 5. Překladové konečné automaty. h(ε) = ε, h(xa) = h(x)h(a), x, x T, a T.

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová

NPRG030 Programování I, 2010/11

Struktura programu v době běhu

AUTOMATY A GRAMATIKY. Pavel Surynek. Kontextové uzávěrové vlastnosti Turingův stroj Rekurzivně spočetné jazyky Kódování, enumerace

Výrazy, operace, příkazy

Západočeská univerzita v Plzni Dokumentace překladače PL/0 v PHP Předmět KIV/FJP

NPRG030 Programování I, 2016/17 1 / :58:13

Algoritmizace a programování

Semestrální práce z předmětu. Jan Bařtipán / A03043 bartipan@studentes.zcu.cz

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Úvod do programování - Java. Cvičení č.4

Programování v C++ 1, 1. cvičení

7. Datové typy v Javě

Textové soubory. alg9 1

Operační systémy. Cvičení 4: Programování v C pod Unixem

Teoretická informatika - Úkol č.1

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

Úvod do programovacích jazyků (Java)

Objektově orientované programování

Programovací jazyky a překladače Úvod do překladačů

Programovací jazyk C(++) C++ area->vm_mm->locked_vm -= len >> PAGE_SHIFT;

IUJCE 07/08 Přednáška č. 1

Formální jazyky. Z. Sawa (VŠB-TUO) Úvod do teoretické informatiky 2. března / 32

Parsování v Haskellu, knihovna Parsec

Konstrukce relace. Postupně konstruujeme na množině všech stavů Q relace i,

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Programování v jazyce JavaScript

Úvod do informatiky. Miroslav Kolařík

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE FORMALISMY PRO SYNTAXÍ ŘÍZENÝ PŘEKLAD: PŘEKLADOVÉ A ATRIBUTOVÉ GRAMATIKY.

Problém, jehož různé instance je třeba často řešit Tyto instance lze vyjádřit větami v jednoduchém jazyce

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

1. Úvodní informace. BI-EP1 Efektivní programování Martin Kačer

Programování. Bc. Veronika Tomsová

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE PŘEKLADY TYPICKÝCH JAZYKOVÝCH KONSTRUKCÍ PROGRAMOVACÍCH JAZYKŮ.

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE STRUKTURA PŘEKLADAČE

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

Preprocesor a koncepce (větších) programů. Úvod do programování 2 Tomáš Kühr

Syntaxí řízený překlad

Prezentace a vysvětlení programového prostředí NXC

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY

Standardní algoritmy vyhledávací.

Data, výrazy, příkazy

Transkript:

Lexikální analýza Miroslav Beneš Dušan Kolář

Rozhraní lexikálního analyzátoru Lexikální analýza 2

Úkoly Čtení zdrojového textu Sestavování symbolů Odstranění mezer a poznámek Normalizace symbolů (velká/malá písmena, spec. znaky,...) Interpretace direktiv překladače Uchovávání informací pro hlášení chyb Zobrazení protokolu o překladu Lexikální analýza 3

Proč řešit lexikální analýzu samostatně? Jednodušší návrh překladače Konvence pro mezery a poznámky Vyšší efektivita Specializované algoritmy Lepší přenositelnost Zvláštnosti vstupní abecedy??( = [ Lexikální analýza 4

Základní pojmy Lexém slovo nad abecedou Kategorie symbolů identifikátor, číslo, relační operátor, levá závorka,... Atributy symbolu řetězec, hodnota, kód operátoru,... Reprezentace symbolu dvojice (kategorie, atribut) Lexikální analýza 5

Příklady lexikálních symbolů Symbol Lexém Vzor const const const relation <, <=,, >= <> id {ltr}({ltr} {dig})* pi, D2 num {dig}+ 0, 123 Lexikální analýza 6

Reprezentace symbolů // kategorie symbolů enum Symbol { IdSym, NumSym, RelOpSym, DotSym,... }; // kategorie operátorů enum Oper { LthOp, GthOp, LeqOp,... }; // atributy symbolů union LexAttr { char* id; int num; Oper relop;... }; // reprezentace lexikálního symbolu struct Token { Symbol sym; // kategorie LexAttr attr; // atribut }; Lexikální analýza 7

Problémy se zdrojovým jazykem Pevný/volný formát (FORTRAN) 12 X=7 * +12*K C poznámka Zpracování mezer (FORTRAN, Basic) DO5I=1.25 / DO5I=1,25 Klíčová slova (PL/I) IF THEN THEN THEN=ELSE; ELSE ELSE=THEN Lexikální analýza 8

Příklad 1 INTEGER FUNCTIONA 2 PARAMETER(A=6,B=2) 3 IMPLICIT CHARACTER*(A-B)(A-B) 4 INTEGER FORMAT(10),IF(10),DO9E1 5 100 FORMAT(4H)=(3) 6 200 FORMAT(4 )=(3) 7 DO9E1=1 8 DO9E1=1,2 9 IF(X)=1... Lexikální analýza 9

Příklad (pokr.) 10 IF(X)H=1 11 IF(X)300,200 12 300 CONTINUE 13 END C this is a comment $FILE(1) 14 END Lexikální analýza 10

Specifikace symbolů Popis běžným jazykem identifikátor je posloupnost písmen a číslic začínající písmenem Regulární (lineární) gramatika I -> p X X-> p X c X p c Regulární výrazy a definice p (p c)* Lexikální analýza 11

Specifikace symbolů Graf přechodů konečného automatu (syntaktický graf) Lexikální analýza 12

Specifikace symbolů Lexikální symboly lze obvykle popsat regulárními jazyky (typ 3) Co nedokážeme popsat? Zanořené konstrukce (závorky) Opakované konstrukce {wcw w {a,b}*} Zadaný počet opakování nha 1 a 2 a n (FORTRAN) Lexikální analýza 13

Regulární výrazy nad Σ RE ε označuje {ε} Je-li a Σ, pak a označuje {a} (prázdný řetězec) Je-li a,b,c, Σ, pak [abc ] označuje množinu {a, b, c, } [aeiouy] [a-za-z] [^0-9] všechno kromě [0-9] Lexikální analýza 14

Regulární výrazy Jsou-li s, t reg. výrazy označující jazyky L(s) a L(t), pak (s) (t) L(s) L(t) (s) (t) L(s) L(t) (s)* (L(s))* (s)+ (L(s))+ = L(s) (L(s))* (s)? L(s) {ε} (s) L(s) Lexikální analýza 15

Příklad [A-Z]([A-Z] [0-9])* [A-Z][A-Z0-9]* [0-9]+.[0-9]+(E[-+]?[0-9]+)? [0-9]+E[-+]?[0-9]+ Lexikální analýza 16

Regulární definice Pojmenované regulární výrazy d 1 -> r 1 d 2 -> r 2... d n -> r n různá reg. výrazy nad jména Σ {d 1, d 2,, d i-1 } Lexikální analýza 17

Regulární definice letter -> [A-Za-z] digit -> [0-9] id -> letter (letter digit)* Použití: konstruktory lex. analyzátorů Lexikální analýza 18

Konečné automaty (Q, Σ, f, q 0, F) Q konečná množina stavů Σ - vstupní abeceda f přechodová funkce q 0 počáteční stav F množina koncových stavů f: Q x (Σ {e}) -> 2 Q f: Q x Σ -> Q rozšířený NKA DKA Lexikální analýza 19

Konečné automaty desítkové číslo šestnáctkové číslo Lexikální analýza 20

Konečné automaty NKA Lexikální analýza 21

Konečné automaty deterministický konečný automat Lexikální analýza 22

Algoritmy pro transformaci Reg. gramatika konečný automat korespondence pravidel gramatiky a přechodové funkce Reg. výraz konečný automat skládání primitivních KA, převod na DKA, minimalizace stromová reprezentace důležité pro konstruktory lex. analyzátorů Lexikální analýza 23

Algoritmy pro transformaci Konečný automat reg. výraz soustava algebraických rovnic X = a X + b X = a* b derivace reg. výrazu Lexikální analýza 24

Konečný automat pro lexikální analýzu Zpracování začíná vždy prvním dosud nezpracovaným znakem ze vstupu Zpracování končí, je-li automat v koncovém stavu a pro další vstupní znak již neexistuje žádný přechod (maximal match): 123 není 12 následované 3 Není-li v nekoncovém stavu přechod možný, vrací se automat do posledního dosaženého koncového stavu nebo je chyba: < <= << 1. 1.2 1..5 Lexikální analýza 25

Speciální případy akce po přijetí symbolu samostatný koncový stav pro každou kategorii výpočet hodnot atributů z lexému klíčová slova koncový stav pro každé klíčové slovo mnoho stavů obvykle jako id, pak následuje rozlišení tabulkou klíč. slov Lexikální analýza 26

Speciální případy komentáře uzavřená cesta procházející poč. stavem diagnostika neukončený komentář dokumentační komentář Javadoc zanořené komentáře znakové řetězce escape sekvence \n ukončení řádku v řetězci je obvykle chyba Unicode Lexikální analýza 27

Implementace lexikálního analyzátoru Přímá Efektivita na úkor složitosti návrhu Stav je reprezentován pozicí v programu Simulace konečného automatu Vhodné spíš pro konstruktory Využití konstruktoru Snadná modifikovatelnost Především v počátečních fázích implementace Lexikální analýza 28

Přímá implementace char text[256]; int leng, ival; int lex(void) { int ch; START: while((ch=getchar())== ) ; /* odstranění mezer */ Lexikální analýza 29

Přímá implementace if( isalpha(ch) ) { leng = 0; do { text[leng++] = ch; } while( isalnum(ch=getchar()) ); text[leng] = \0 ; ungetc(ch,stdin); return(ident); } Lexikální analýza 30

Přímá implementace else if( isdigit(ch) ) { ival = 0; do { ival = 10*ival+(ch- 0 ); } while( isdigit(ch=getchar()) ); ungetc(ch,stdin); return(num); } Lexikální analýza 31

Přímá implementace } else if (ch== { ) { while( (ch=getchar())!= } && ch!=eof); if( ch==eof ) { error( Missing end of comment ); return(eof); } goto START; } else return(ch); /* ostatní znaky */ Lexikální analýza 32

Přímá implementace getchar() čte znaky ze vstupu udržuje aktuální číslo řádku kopie zdrojového textu do protokolu správa vyrovnávacích pamětí makrogenerátor (např. C, C++) ungetc() vrací zpět jeden nebo více znaků Java: java.io.pushbackinputstream Lexikální analýza 33

Implementace konečného automatu Tabulka + Přechodová funkce + Interpret výhodné jako výstup konstruktoru Přímý přepis do programu Lexikální analýza 34

Implementace konečného automatu static int state; int next(int newstate) { state = newstate; return getchar(); } int lex(void) { int ch = next(0); Lexikální analýza 35

Implementace konečného automatu for(;;) switch(state) { case 0: if (ch== ) ch = next(0); else if( isalpha(ch) ) { leng = 0; text[leng]=ch; ch = next(1); } Lexikální analýza 36

Implementace konečného automatu /* case 0: */ else if (isdigit(ch)) { ival = ch- 0 ; ch = next(2); } else if (ch== { ) ch = next(3); else return(ch); break; Lexikální analýza 37

Implementace konečného automatu case 1: if (isalnum(ch)) { } text[++leng] = ch; ch = next(1); else { } text[++leng] = \0 ; unget(ch,stdin); return(ident); break; Lexikální analýza 38

Implementace konečného automatu Lexikální analýza 39

Implementace konečného automatu } } case 3: if (ch==eof) { error( Missing end of comment ); return(eof); } else if (ch== } ) ch = next(0); else ch = next(3); break; Lexikální analýza 40

Konstruktor LEX / FLEX %{ #include <stdlib.h> #define IDENT 256 #define NUM 257 int yyival; %} Lexikální analýza 41

Konstruktor LEX / FLEX space [ \t\n] ws {space}+ \{[^}]*\} letter [A-Za-z] digit [0-9] id {letter}({letter} {digit})* number {digit}+ %% Lexikální analýza 42

Konstruktor LEX / FLEX {ws} {/* no action, no return */} {id} return(ident); {number} { yyival=atoi(yytext); return(num); }. return(yytext[0]); Lexikální analýza 43