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

Podobné dokumenty
PROGRAMOVACÍ JAZYKY A PŘEKLADAČE REALIZACE PŘEKLADAČE I

GENEROVÁNI KÓDU jazyk Mila

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

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

Konstruktory překladačů

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

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

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

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

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

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

Algoritmizace a programování

Konečný automat. Jan Kybic.

Poslední aktualizace: 14. října 2011

Úvod do programovacích jazyků (Java)

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE PŘEKLADY TYPICKÝCH JAZYKOVÝCH KONSTRUKCÍ PROGRAMOVACÍCH 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ů

Programovací jazyk Pascal

Zápis programu v jazyce C#

Textové soubory. alg9 1

Překladač a jeho struktura

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

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

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

Programovací jazyk C++ Hodina 1

Lexikální analýza (Obsah)

Uplatnění metod na zvolený jazyk

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

Např.: // v hlavičkovém souboru nebo na začátku // programu (pod include): typedef struct { char jmeno[20]; char prijmeni[20]; int rok_nar; } CLOVEK;

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

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

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

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

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

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

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

Základy programování (IZP)

Algoritmizace a programování

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

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

Implementace LL(1) překladů

Abstraktní třídy, polymorfní struktury

Výrazy, operace, příkazy

Programovanie v jazyku C - struktury a polia

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

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

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

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

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.

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

NPRG030 Programování I, 2010/11

Práce se soubory. Základy programování 2 Tomáš Kühr

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

Regulární výrazy. Vzory

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

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

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

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

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

A Tutorial. George J. Klir State University of New York (SUNY) Binghamton, New York 13902, USA

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Algoritmizace a programování

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

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

Lekce 19 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

Datové struktury. alg12 1

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

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

dostat zdroják Petr Zemek Fakulta informačních technologií VUT v Brně izemek

IAJCE Přednáška č. 6. logický celek, řešící dílčí část problému Příklad velmi špatného zápisu programu na výpočet obsahu obdélníku

10 Práce s řetězci - pokračování

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

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

Data, výrazy, příkazy

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

PSK3-9. Základy skriptování. Hlavička

Jazyk C# a platforma.net

Interpret jazyka IFJ2011

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

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

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

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

Výrazy, operace, příkazy

Naproti tomu gramatika je vlastně soupis pravidel, jak

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

ZÁPOČTOVÝ TEST. Zpracoval Vilém Závodný, #include "stdafx.h" #include "stdio.h"

Semestrální práce implementuje univerzální tokenizer založený na stavovém automatu. Jsou implementovány následující automaty:

Zápis programu v C a základní řídicí struktury

IAJCE Přednáška č. 7. řízení semaforu na křižovatce = přepínání červená/oranžová/zelená

Algoritmizace a programování

Opakování programování

Část I. Část 1 Zápis programu v C. Přehled témat. Zápis programu v C a základní řídicí struktury. Program je recept

Objektově orientované programování

Zápis programu v C. Zápis programu v C Funkce Literály

Př. další použití pointerů

Výčtový typ strana 67

Jazyk C++, některá rozšíření oproti C

Základní datové typy, proměnné - deklarujeme předem - C je case sensitive rozlišuje malá a velká písmena v názvech proměnných a funkcí

Transkript:

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LEXIKÁLNÍ ANALÝZA 2011 Jan Janoušek BI-PJP Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

LEXIKÁLNÍ ANALÝZA Kód ve vstupním jazyku Lexikální analyzátor Posloupnost tokenů, tyto tokeny jsou terminální symboly bezkontextové gramatiky, která popisuje syntaxi vstupního jazyka

Z pohledu teorie formálních jazyků Jazyk lexikálních tokenů lze popsat regulární gramatikou a lexikální analyzátor je proto realizovaný konečným automatem! Příklad regulární gramatiky generující jazyk identifikátorů a celých čísel: G = ({S, A, B}, {p, c}, P, S), kde P obsahuje pravidla: S -> p p A c c B A -> p c p A c A B -> c c B

LEXIKÁLNÍ ANALYZÁTOR (LA) Rozpoznává lexikální elementy (tzv. tokeny) identifikátory klíčová slova literály (čísla, řetězce) jedno a víceznakové speciální symboly Vynechává oddělovače lexikálních elementů mezery, oddělovače řádků komentáře Rozpoznává a reaguje na direktivy překladače #include #if...

LEXIKÁLNÍ ANALYZÁTOR dále vrací syntetizované atributy tokenů: Příklad lexikálního elementu Identifikátor syntetizovaný atribut lexikálního elementu Textová podoba identifikátoru Celé číslo Hodnota čísla Reálné číslo Hodnota čísla

Komunikace lexikální <-> syntaktický analyzátor Kód ve vstupním jazyku Lexikální analyzátor get_next_token() Syntaktický analyzátor Lexikální element + případně jeho syntetizované atributy

Příklad Vstupní kód: if a<0 then {toto je poznamka} znam := -1; Posloupnost lexikálních elementů (a atributů), kterou vrací lexikální analyzátor: <kwif> <ident> ( a ) <less> <numb> (0) <kwthen> <ident> ( znam ) <assign> <minus> <numb> (1) <semicolon>

Návrh a konstrukce LA Syntaxe lexikálních elementů Lexikální elementy a jejich reprezentace Vstupní symboly a jejich reprezentace Návrh konečného automatu Programová realizace POZN. Existují také generátory lexikálních analyzátorů, např. programy lex, flex, (viz. předmět BI-AAG)

Příklad syntaxe lexikálních elementů lexikální-element = identifikátor číslo spec-symbol spec-symbol = '+' '-' '<' '<=' ':=' klíčové-slovo klíčové-slovo = 'if' 'then' 'else' identifikátor = písmeno (písmeno číslice)* (pozn. zapsáno regulárním výrazem) číslo = číslice {číslice}* (pozn. zapsáno regulárním výrazem) písmeno = 'A' 'B'... 'Z' 'a' 'b'... 'z' číslice = '0' '1' '2' '3' '4' '5' '6' '7' '8' '9

Příklad oddělovačů lexikálních elementů mezera, oddělovač řádků, komentář komentář je posloupnost znaků začínající znakem '{' a končící znakem '}', který jinak není v posloupnosti obsažen komentář musí být dokončen každý identifikátor nebo klíčové slovo musí být od následujícího identifikátoru, klíčového slova nebo čísla odděleno alespoň jedním oddělovačem lexikálních elementů

Příklad: Lexikální elementy a jejich reprezentace

Zpracování klíčových slov Klíčová slova se často zpracovávají v rámci identifikátorů: nedělají se pro ně speciální přechody automatu, ale po zjistění identifikátoru se podle tabulky klíčových slov zkontroluje jestli identifikátor není náhodou klíčovým slovem (pokud ano, pak lexikální analyzátor vrátí token příslušného klíčového slova)

Vstupní symboly a jejich reprezentace

Vstupní symboly a jejich reprezentace Realizace vstupní funkce: static int Znak; // vstupni znak static char Vstup; // vstupni symbol void CtiVstup(void) { Znak = CtiZnak(); if (Znak>='A' && Znak<='Z' Znak>='a' && Znak<='z') Vstup = 'p'; else if (Znak>='0' && Znak<='9') Vstup = 'c'; else if (Znak == EOF) Vstup = 'e'; else if (Znak <= ' ') Vstup = 'm'; else Vstup = Znak; }

Společně s tokenem identifikátor lexikální analyzátor vrací: příklad atributové překladové gramatiky na tabuli

Zavedení nového koncového stavu Rozdíl mezi standartním konečným automatem (KA) a lexikálním analyzátorem: KA čte vstupní posloupnost znaků až do konce. Lexikální analyzátor se čtením vstupu končí, dostane-li vstupní symbol, který již do rozpoznávaného lexikálního elementu nepatří lexikální analyzátor při dosažení konce vstupní posloupnosti znaků vrátí speciální lexikální symbol (EOI) Úprava přechodového diagramu: doplníme nový koncový stav reprezentující akci návrat z lexikálního analyzátoru z každého původního koncového stavu vedeme hranu do nového koncového stavu ohodnocenou vstupními symboly, které se nevyskytují v ohodnocení jiných hran vedoucích z daného koncového stavu z počátečního stavu vedeme hranu do nového koncového stavu ohodnocenou vstupním symbolem označujícím konec souboru

Zavedení nového koncového stavu

Doplnění o sémantické akce Vypočítávají hodnoty syntetizovaných atributů lexikálních elementů

Doplnění o sémantické akce

Sémantické akce A 1 : delkaid = 1; Ident[0] = Znak; A 2 : if (delkaid<maxlenident) {Ident[delkaId] = Znak; delkaid++;} A 3 : Ident[delkaId] = 0; Symb = KlicoveSlovo(Ident); A 4 : Cislo = Znak -'0'; Symb = NUMB; A 5 : Cislo = 10 * Cislo + (Znak -'0'); A 6 : Symb = PLUS; A 7 : Symb = MINUS; A 8 : Symb = LESS; A 9 : Symb = LESS_OR_EQ; A 10 : Symb = ASSIGN; A 11 : Symb = EOI; A 12 : Chyba("Neocekavany konec souboru v komentari");

Programová realizace /* lexan.h */ typedef enum {IDENT, NUMB, PLUS, MINUS, LESS, LESS_OR_EQ, ASSIGN, kwif, kwthen, kwelse, EOI} LexSymbol; enum {MaxLenIdent = 32}; extern LexSymbol Symb; extern char Ident[MaxLenIdent+1]; /* atribut symbolu IDENT */ extern int Cislo; /* atribut symbolu NUMB */ void CtiSymb(void); void InitLexan(char*);

Programová realizace /* lexan.c */ #include "lexan.h" #include "vstup.h" #include <stdlib.h> #include <string.h> #include <stdio.h> LexSymbol Symb; char Ident[MaxLenIdent]; /* atribut symbolu IDENT */ int Cislo; /* atribut symbolu NUMB */ static int Znak; // vstupni znak static char

Programová realizace void CtiVstup(void) { Znak = CtiZnak(); if (Znak>='A' && Znak<='Z' Znak>='a' && Znak<='z') Vstup = 'p'; else if (Znak>='0' && Znak<='9') Vstup = 'c'; else if (Znak == EOF) Vstup = 'e'; else if (Znak <= ' ') Vstup = 'm'; else Vstup = Znak; }

Programová realizace const struct {char* slovo; LexSymbol symb;} TabKS[] = { {"if", kwif}, {"then", kwthen}, {"else", kwelse}, {NULL, IDENT} }; LexSymbol KlicoveSlovo(char* id) //rozpoznani klicoveho slova tabulkou { int i = 0; while (TabKS[i].slovo) if (strcmp(id, TabKS[i].slovo)==0) return TabKS[i].symb; else i++; return IDENT; } void Chyba(char* text) { printf("\n%s\n", text); exit(1); }

Programová realizace void CtiSymb(void) { int delkaid; q0: /*0*/ while (Vstup=='m') CtiVstup(); switch (Vstup) { case 'e': Symb = EOI; break; case '{': CtiVstup(); /*1*/ while (Vstup!='}' && Vstup!='e') CtiVstup(); if (Vstup=='e') Chyba("neocekav any konec souboru v komentari"); else { CtiVstup(); goto q0; }

Programová realizace case 'p': /*A1*/ delkaid = 1; Ident[0] = Znak; CtiVstup(); /*2*/ while (Vstup=='p' Vstup=='c') { /*A2*/ if (delkaid<maxlenident) {Ident[delkaId] = Znak; delkaid++;} CtiVstup(); } /*A3*/ Ident[delkaId] = 0; Symb = KlicoveSlovo(Ident); break; case 'c': /*A4*/ Cislo = Znak -'0'; Symb = NUMB; CtiVstup(); /*3*/ while (Vstup=='c') { /*A5*/ Cislo = 10 * Cislo + (Znak -'0'); CtiVstup(); } break;

Programová realizace case '+': /*A6*/ Symb = PLUS; CtiVstup(); /*4*/ break; case '-': /*A7*/ Symb = MINUS; CtiVstup(); /*5*/ break; case '<': CtiVstup(); /*6*/ if (Vstup!='=') { /*A8*/ Symb = LESS; break; } CtiVstup(); /*7*/ /*A9*/ Symb = LESS_OR_EQ; break;

Programová realizace } case ':': CtiVstup(); /*8*/ if (Vstup!='=') Chyba("ocekava se ="); CtiVstup(); /*9*/ /*A10*/ Symb = ASSIGN; break; default: Chyba("nedovoleny znak"); } /*K*/ void InitLexan(char *jmeno) { InitVstup(jmeno); CtiVstup(); }