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

Podobne dokumenty
Zajęcia P4. Analizator semantyczny i generator kodu (Pascal)

Generatory analizatorów

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 1. Programowanie komputerowe

Podstawy Kompilatorów

Podstawy Kompilatorów

Wstęp do programowania

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

Programowanie w Turbo Pascal

Języki programowania zasady ich tworzenia

Analiza leksykalna i generator LEX

KONSTRUKCJA KOMPILATORÓW

WIADOMOŚCI WSTĘPNE WPROWADZENIE DO JĘZYKA TURBO PASCAL. Klawisze skrótów. {to jest właśnie komentarz, moŝna tu umieścić dowolny opis}

Wykład II PASCAL - podstawy składni i zmienne, - instrukcje wyboru, - iteracja cz. 1

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

Laboratorium z użyciem analizatora leksykalnego FLEX

Zaawansowane aplikacje internetowe

Wykład II PASCAL - podstawy składni i zmienne, - instrukcje wyboru, - iteracja, - liczby losowe

Podstawy Kompilatorów

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Ćwiczenia nr 11. Translatory. Wprowadzenie teoretyczne

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Bloki anonimowe w PL/SQL

Programy pomocnicze: diff, make, systemy rcs i cvs, debugger. Zarządzanie wersjami.

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

Programowanie w języku Python. Grażyna Koba

Języki formalne i techniki translacji

Język programowania PASCAL

Programowanie systemów czasu rzeczywistego laboratorium. Ćwiczenie 2. Temat zajęć: pakiety, zadania, synchronizacja czasowa, mechanizm spotkań

Procedury i funkcje. Przykład programu z procedurą. Definicja. Cechy procedury

Podstawy Kompilatorów

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

Trochę o plikach wsadowych (Windows)

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

D:\DYDAKTYKA\ZAI_BIS\_Ćwiczenia_wzorce\04\04_poprawiony.doc 2009-lis-23, 17:44

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

IBM SPSS Statistics - Essentials for R: Instrukcje instalacji dla Linux

L E X. Generator analizatorów leksykalnych

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ć

Podstawy programowania

Pascal - wprowadzenie

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Flex - generator analizatorów leksykalnych

Administracja sieciowymi systemami operacyjnymi III Klasa - Linux

Zadanie analizy leksykalnej

Interpreter - EasyCompile

Przedmiot: Informatyka w inżynierii produkcji Forma: Laboratorium Temat: Zadanie 5. MessageBox, InputBox, instrukcja Select Case i instrukcje pętli.

Elementy języka C. ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors.

Plik->Opcje->Zakladka Główne->Dostosuj Wstążkę Zaznaczamy kwadracik Developer na liscie po prawej stronie. Klikamy OK.

Instrukcja standardowa Writeln

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

METODY REPREZENTACJI INFORMACJI

Programowanie kontrolera RH robota S-420S Opracował: Karol Szostek

System operacyjny Linux

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

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Ada95 przetwarzanie rozproszone

Ada95 przetwarzanie rozproszone

W przeciwnym wypadku wykonaj instrukcję z bloku drugiego. Ćwiczenie 1 utworzyć program dzielący przez siebie dwie liczby

Jerzy Nawrocki, Wprowadzenie do informatyki

Konfiguracja pakietu CrossStudio for MSP

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

Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka

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

Program szkoleniowy. 24 h dydaktycznych (18 h zegarowych) NAZWA SZCZEGÓŁY CZAS

WOJSKOWA AKADEMIA TECHNICZNA im. Jarosława Dąbrowskiego LABORATORIUM UKŁADÓW PROGRAMOWALNYCH I SPECJALIZOWANYCH

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

Podstawy Programowania

10. Translacja sterowana składnią i YACC

Makropolecenia w PowerPoint Spis treści

Pascal typy danych. Typy pascalowe. Zmienna i typ. Podział typów danych:

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

Jerzy Nawrocki, Wprowadzenie do informatyki

ForPascal Interpreter języka Pascal

Programowanie w Ruby

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Wprowadzenie do programowania w VBA

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Informatyka 1. Wyrażenia i instrukcje, złożoność obliczeniowa

1 Podstawy c++ w pigułce.

Podstawy programowania

Zajęcia nr 1 Podstawy programowania. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

PASCAL Kompendium. Środowisko TURBO PASCAL Skróty klawiaturowe. Edycja kodu Pomoc spis treści. Skopiowanie zaznaczonego bloku do schowka

Metody Kompilacji Wykład 13

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Algorytmika i Programowanie VBA 1 - podstawy

LibreOffice Calc VBA

Wstęp do programowania. Procedury i funkcje. Piotr Chrząstowski-Wachtel

1 Przygotował: mgr inż. Maciej Lasota

Pliki. Operacje na plikach w Pascalu

Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki

Metody Kompilacji Wykład 1 Wstęp

zastępować zarezerwowane słowa lub symbole innymi,

Język PL/SQL. Rozdział 5. Pakiety podprogramów. Dynamiczny SQL

Podstawy JavaScript ćwiczenia

INSTRUKCJA PUSTA. Nie składa się z żadnych znaków i symboli, niczego nie robi. for i := 1 to 10 do {tu nic nie ma};

Algorytmy i struktury danych

Cheatsheet PL/SQL Andrzej Klusiewicz 1/9

Projekt procesora NIOSII w strukturze programowalnego układu logicznego CYCLONEII EP2C35F672C6 podłączenie i obsługa wyświetlacza LCD.

Ćwiczenia 2 IBM DB2 Data Studio

Transkrypt:

Zajęcia P2AM. Analizator składniowy (Flex + Bon, Lux) 1. Cel ćwiczeń Celem ćwiczeń jest stworzenie analizatora składniowego dla języka będącego podzbiorem języka wysokiego poziomu (Ada lub Modula2). Przy tworzeniu analizatora należy skorzystać ze stworzonego analizatora leksykalnego. Sprawdzenie działania analizatora należy przeprowadzić dla zadanego programu testowego (ltascii.adb lub test.mod). 2. Środowko Lux, Flex + Bon A) po włączeniu komputera wybieramy system operacyjny Lux (użytkownik student) B) uruchomienie edytora tekstu i konsoli roboczej C) utworzenie w oknie konsoli własnego katalogu (mkdir nazwko) D) przejście do własnego katalogu (cd nazwko) E) UWAGA! Po zakończeniu zajęć należy skopiować własne projekty, a następnie skasować je z twardego dysku. 3. Informacja o programach Lex/Flex oraz Yacc/Bon A) Do utworzenia programu zaleca się skorzystać z pliku Makefile, który można ściągnąć (nie kopiować z edytora) ze strony przedmiotu! Kompilacji i łączenia dokonuje się za pomocą polecenia make. Wykonywalny plik programu nosi nazwę x, gdzie x to ada lub modula. Alternatywnie można wykonać poniższe polecenia: a. Generacja kodu analizatora składniowego (pliki y.tab.c oraz y.tab.h): bon d x.y b. Generacja kodu skanera (plik lex.yy.c): flex -t x.l > x.c c. Kompilacja kodu parsera (plik zad): gcc x.tab.c x.c o x B) Przekierowanie standardowych strumieni:./x <plik_we >plik_wy C) wartość wykrytego tokena należy ustawić w zmiennej yylval (w kodzie dla Flex a) D) postać reguł składniowych: A: B C D {akcja semantyczna} ; E) wartość zmiennej po lewej stronie reguły składniowej: $$ (left value) F) wartość tokenów i zmiennych po prawej stronie reguły składniowej: $1, $2, $3 G) predefiowany token błędu: yyerror H) predefiowane makra dla akcji semantycznych w Yacc u: YYABORT zakończenie działania parsera z sygnalizacją błędu YYACCEPT zakończenie działania parsera z sygnalizacją akceptacji YYERROR generuje błąd składniowy jednak bez wywoływania procedury yyerror 4. Analizator składniowy (realizowany stopniowo zgodnie z strukcjami zapanymi w pliku *.y). UWAGA 1! Zadanie należy realizować krok po kroku sprawdzając efekty działania kolejnych realizowanych reguł składniowych. Po rozpoznaniu konstrukcji składniowej należy wypać stosowny komunikat. UWAGA 2! Do wypywania formacji o znalezionych strukturach składniowych należy używać funkcji found() z pliku x.y. A) Czynności wstępne a) Wgranie własnego pliku x.l (x to ada lub modula) b) Ściągnięcie ze strony przedmiotu i rozpakowanie pliku x-syn.tgz c) Zapanie formacji o autorze w pliku parser.y. d) Wypywanie własnego imienia i nazwka na początku programu (funkcja ma() w x.y). e) Kompilacja programu z wykorzystaniem pliku Makefile lub za pomocą poleceń (pkt 3). f) Uruchomienie programu B) Rozpoznawane konstrukcje języka Ada Modula a) specyfikacja kontekstu (klauzule with i a) deklaracja IMPORT

use) b) nagłówek procedury c) deklaracja pakietu d) deklaracje zmiennych e) wywołanie procedury f) przypanie g) pętla for h) blok i) ciało pakietu j) strukcja warunkowa i deklaracja procedury b) deklaracja stałej c) deklaracja zmiennej d) wywołanie procedury e) pętla FOR f) przypanie g) strukcja warunkowa h) moduł programu UWAGA 3! Składnia języków ada i modula 2 jest o wiele bardziej skomplikowana niż może to wynikać z realizowanego projektu. Na laboratorium upraszczamy tę składnię tak, by można było przeanalizować program testowy. Pliki testowe: Przykładowy plik testowy dla języka ada Przykładowy plik testowy dla moduli 2 Ten program drukuje znaki i ich kody ASCII (********************************************************) Kompilacja: gnatmake test (* Program pokazuje kody ASCII *) (* Kompilacja: *) with Ada.Text_IO; use Ada.Text_IO; with Ada.Integer_Text_IO; (* m2c all test.mod o test *) (* Uruchomienie: *) (*./test *) Test (********************************************************) MODULE test; package MyTest LtAscii(LowerBound: Integer; UpperBound: Integer); MyTest; package body MyTest LtAscii(LowerBound: Integer; UpperBound: Integer) Uc : Character := ' '; Fl : Float; Put_Le("Kody ASCII:"); zmienna for I Integer range LowerBound.. UpperBound loop Ada.Integer_Text_IO.Put(I); Ada.Integer_Text_IO cyfra Put(' '); Put(Uc); Uc := Character'Succ(Uc); loop; tylko test procedura z to jest procedura z Ada.Text_IO kolejny znak Fl := 1.1 * 0.1 + 1.0e 2; po kropce i przed zawsze LtAscii; MyTest; FROM InOut IMPORT Write, WriteCard, WriteStrg, WriteLn; CONST FromAscii = 32; ToAscii = 127; VAR i : CARDINAL; fl : REAL; BEGIN WriteStrg("Kody ASCII"); WriteLn; FOR i := FromAscii TO ToAscii DO WriteCard(i, 3); Write(' '); Write(CHR(i)); WriteLn ; fl := 1.1 + 1.0E 2 + 1.0E+2 + 1.0E1; (* liczby rzeczywte *) IF (fl <= 11.11) AND (fl >= 1.111E1) THEN WriteStrg("Zgodnie z oczekiwaniami") ELSE WriteStrg("Olaboga!") ; WriteLn test. use MyTest; FromASCII : constant Integer := 32; ToASCII : constant Integer := 127;

if FromAscii <= ToAscii then LtAscii(FromAscii, ToAscii); else Put_Le("Figa"); if; Test; Przykładowy efekt działania analizatora składniowego Język ada Modula 2 Imie i Nazwko yytext Typ tokena Wartosc tokena znakowo Imie i Nazwko yytext Typ tokena Wartosc tokena znakowo with KW_WITH Text_IO IDENT Text_IO ===== FOUND: WITH_CLAUSE ===== use KW_USE Text_IO IDENT Text_IO ===== FOUND: USE_CLAUSE ===== ===== FOUND: CONTEXT_SPEC ===== with KW_WITH Integer_Text_IO IDENT Integer_Text_IO ===== FOUND: WITH_CLAUSE ===== ===== FOUND: CONTEXT_SPEC ===== Test IDENT Test ===== FOUND: PROC_HEADER 'Test'===== package KW_PACKAGE LtAscii IDENT LtAscii ===== FOUND: PROC_HEADER 'LtAscii'===== ===== FOUND: PROC_DECL 'LtAscii'===== ===== FOUND: PACKAGE_DECL 'MyTest'===== package KW_PACKAGE body KW_BODY LtAscii IDENT LtAscii ===== FOUND: PROC_HEADER 'LtAscii'===== MODULE KW_MODULE test IDENT test FROM KW_FROM InOut IDENT InOut IMPORT KW_IMPORT WriteCard IDENT WriteCard WriteStrg IDENT WriteStrg ===== FOUND: IMPORT 'InOut'===== CONST KW_CONST = = 32 INTEGER_CONST 32 ===== FOUND: CONST_DECL 'FromAscii'===== = = 127 INTEGER_CONST 127 ===== FOUND: CONST_DECL 'ToAscii'===== VAR KW_VAR CARDINAL IDENT CARDINAL ===== FOUND: VAR_DECL ===== REAL IDENT REAL ===== FOUND: VAR_DECL ===== BEGIN WriteStrg IDENT WriteStrg "Kody ASCII" STRING_CONST "Kody ASCII" ===== FOUND: PROCEDURE_CALL 'WriteStrg'===== FOR KW_FOR TO KW_TO DO KW_DO WriteCard IDENT WriteCard 3 INTEGER_CONST 3 ===== FOUND: PROCEDURE_CALL 'WriteCard'===== ' ' STRING_CONST ' '

Character IDENT Character ' ' CHARACTER_CONST ' ' ===== FOUND: VAR_DECL 'Uc'===== Fl IDENT Fl Float IDENT Float ===== FOUND: VAR_DECL 'Fl'===== New_Le IDENT New_Le ===== FOUND: PROCEDURE_CALL 'New_Le'===== Put_Le IDENT Put_Le "Kody ASCII:" STRING_CONST "Kody ASCII:" ===== FOUND: PROCEDURE_CALL 'Put_Le'===== for KW_FOR I IDENT I range KW_RANGE.. RANGE ===== FOUND: PROCEDURE_CALL 'LowerBound'===== loop KW_LOOP ===== FOUND: PROCEDURE_CALL 'UpperBound'===== Integer_Text_IO IDENT Integer_Text_IO I IDENT I ===== FOUND: PROCEDURE_CALL 'I'===== ===== FOUND: PROCEDURE_CALL 'Ada.Integer_Text_IO.Put'===== ' ' CHARACTER_CONST ' ' ===== FOUND: PROCEDURE_CALL 'Put'===== ===== FOUND: PROCEDURE_CALL 'Uc'===== ===== FOUND: PROCEDURE_CALL 'Put'===== Character IDENT Character ' ' Succ IDENT Succ ===== FOUND: PROCEDURE_CALL 'Uc'===== ===== FOUND: PROCEDURE_CALL 'Character'===== ===== FOUND: ASSIGNMENT 'Uc'===== New_Le IDENT New_Le ===== FOUND: PROCEDURE_CALL 'New_Le'===== loop KW_LOOP ===== FOUND: FOR_LOOP ===== Fl IDENT Fl 1.1 FLOAT_CONST 1.1 * * 0.1 FLOAT_CONST 0.1 1.0e-2 FLOAT_CONST 1.0e-2 ===== FOUND: PROCEDURE_CALL 'Write'===== CHR IDENT CHR ===== FOUND: PROCEDURE_CALL 'Write'===== ===== FOUND: FOR_STATEMENT 'i'===== 1.1 FLOAT_CONST 1.1 1.0E-2 FLOAT_CONST 1.0E-2 1.0E+2 FLOAT_CONST 1.0E+2 1.0E1 FLOAT_CONST 1.0E1 ===== FOUND: ASSIGNMENT 'fl'===== IF <= LE 11.11 FLOAT_CONST 11.11 AND KW_AND >= GE 1.111E1 FLOAT_CONST 1.111E1 THEN KW_THEN WriteStrg IDENT WriteStrg "Zgodnie z oczekiwanstring_const "Zgodnie z oczekiwaniami" ===== FOUND: PROCEDURE_CALL 'WriteStrg'===== ELSE KW_ELSE WriteStrg IDENT WriteStrg "Olaboga!" STRING_CONST "Olaboga!" ===== FOUND: PROCEDURE_CALL 'WriteStrg'===== ===== FOUND: IF_STATEMENT ===== test IDENT test ===== FOUND: PROGRAM_MODULE 'test'=====

===== FOUND: ASSIGNMENT 'Fl'===== LtAscii IDENT LtAscii ===== FOUND: BLOCK ===== ===== FOUND: PROC_DEFINITION 'LtAscii'===== ===== FOUND: PACKAGE_BODY 'MyTest'===== use KW_USE ===== FOUND: USE_CLAUSE ===== FromASCII IDENT FromASCII constant KW_CONSTANT 32 INTEGER_CONST 32 ===== FOUND: CONST_DECL 'FromASCII'===== ToASCII IDENT ToASCII constant KW_CONSTANT 127 INTEGER_CONST 127 ===== FOUND: CONST_DECL 'ToASCII'===== if <= LE ===== FOUND: PROCEDURE_CALL 'FromAscii'===== then KW_THEN ===== FOUND: PROCEDURE_CALL 'ToAscii'===== LtAscii IDENT LtAscii ===== FOUND: PROCEDURE_CALL 'FromAscii'===== ===== FOUND: PROCEDURE_CALL 'ToAscii'===== ===== FOUND: PROCEDURE_CALL 'LtAscii'===== else KW_ELSE Put_Le IDENT Put_Le "Figa" STRING_CONST "Figa" ===== FOUND: PROCEDURE_CALL 'Put_Le'===== New_Le IDENT New_Le ===== FOUND: PROCEDURE_CALL 'New_Le'===== if ===== FOUND: IF_STATEMENT ===== Test IDENT Test ===== FOUND: BLOCK ===== ===== FOUND: PROC_DEFINITION 'Test'=====