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

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

Generatory analizatorów

Semantyka i Weryfikacja Programów - Laboratorium 6

Wybrane narzędzia do tworzenia analizatorów leksykalnych i składniowych w C/C++ Narzędzia, zastosowanie oraz próby rankingu.

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

Metody Kompilacji Wykład 1 Wstęp

Zadanie analizy leksykalnej

Generator skanerów Flex

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

Tworzenie języków specyfikacji dla zagadnień numerycznych

Analiza leksykalna i generator LEX

Metody Kompilacji Wykład 3

Wykład 5. Jan Pustelnik

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

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

Program We Kompilator Wy Źródłowy

Świat parserów. Krzysztof Leszczyński Polska Grupa Użytkowników Linuxa

L E X. Generator analizatorów leksykalnych

Bison - generator analizatorów składniowych

10. Translacja sterowana składnią i YACC

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

Języki i metody programowania Java. Wykład 2 (część 2)

Wprowadzenie do kompilatorów

Automatyczne generowanie kodu. 4Developers, 26 marca 2010

Zaawansowany kurs języka Python

Analizator syntaktyczny

KONSTRUKCJA KOMPILATORÓW

Flex - generator analizatorów leksykalnych

Metody Kompilacji Wykład 13

Wstęp Budowa Serwlety JSP Podsumowanie. Tomcat. Kotwasiński. 1 grudnia 2008

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Programowanie obiektowe

Metody Kompilacji Wykład 7 Analiza Syntaktyczna

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Podstawy generatora YACC. Bartosz Bogacki.

Generator YACC: gramatyki niejednoznaczne

Metody kompilacji Wykłady 4-5

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

Analiza semantyczna. Gramatyka atrybutywna

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

Podstawy Kompilatorów

Wykład V. Rzut okiem na języki programowania. Studia Podyplomowe INFORMATYKA Podstawy Informatyki

Obiektowa implementacja parsera klasy LL(1)

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

Programowanie obiektowe

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

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

Podstawy Kompilatorów

Krótka Historia. Co to jest NetBeans? Historia. NetBeans Platform NetBeans IDE NetBeans Mobility Pack Zintegrowane moduły. Paczki do NetBeans.

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

Extensible Markup Language (XML) Wrocław, Java - technologie zaawansowane

Perl a XML. Narzędzia informatyczne w językoznawstwie. Generowanie danych XML - Przykład. Generowanie danych XML. Perl - Przetwarzanie XML

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Programowanie w Internecie. Java

29. Poprawność składniowa i strukturalna dokumentu XML

Programowanie obiektowe zastosowanie języka Java SE

Laboratorium z użyciem analizatora leksykalnego FLEX

Translacja wprowadzenie

Wybrane narzędzia wspomagające dokumentowanie programu

Wykład 10. Translacja sterowana składnią

Java EE produkcja oprogramowania

Gramatyki atrybutywne

INFORMATYKA, TECHNOLOGIA INFORMACYJNA ORAZ INFORMATYKA W LOGISTYCE

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

Kurs programowania. Wykład 7. Wojciech Macyna. 25 kwietnia 2017

Programowanie obiektowe

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Uproszczony schemat działania kompilatora

Języki programowania zasady ich tworzenia

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Programowanie w C++ Wykład 1. Katarzyna Grzelak. 26 luty K.Grzelak (Wykład 1) Programowanie w C++ 1 / 28

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Uproszczony schemat działania kompilatora

WYKORZYSTANIE JĘZYKA GROOVY W TESTACH JEDNOSTKOWYCH, INTEGRACYJNYCH I AUTOMATYCZNYCH. Mirosław Gołda, Programista Java

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Microsoft IT Academy kurs programowania

ZYKI BEZKONTEKSTOWE (KLASA

DSL w środowisku Eclipse. Grzegorz Białek Architekt techniczny, Sygnity S.A.

Kurs języka Python Wykład 8. Przetwarzanie tekstu Wyrażenia regularne Biblioteka urllib Parsowanie html'a XML

Zakres treści Czas. 2 Określenie charakteru i tematyki strony. Rodzaje witryn. Projekt graficzny witryny. Opracowanie skryptów

Programowanie komputerów

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Języki formalne i gramatyki

METODY REPREZENTACJI INFORMACJI

Języki formalne i automaty Ćwiczenia 4

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

Języki i techniki programowania Ćwiczenia 2

Kurs rozszerzony języka Python

Programowanie w C++ Wykład 1. Katarzyna Grzelak. 25 luty K.Grzelak (Wykład 1) Programowanie w C++ 1 / 38

Języki i Środowiska Programowania Baz Danych 2010/2011 PJWSTK, 2010

Wprowadzenie do XML. Joanna Jędrzejowicz. Instytut Informatyki

Ćwiczenia nr 11. Translatory. Wprowadzenie teoretyczne

Automatyczne generowanie testów z modeli. Bogdan Bereza Automatyczne generowanie testów z modeli

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Programowanie obiektowe - 1.

Ryszard Myhan. Wykład 1: Języki programowania

Programowanie obiektowe

Transkrypt:

Zwięzły opis narzędzi wraz konkretnymi przykładami, próba porównania i rankingu

Do stworzenia parsera nie jest konieczne używanie zewnętrznych narzędzi można posłużyć się algorytmem tworzenia funkcji rekurencyjnych dla obliczania atrybutów gramatyki L-atrybutywnej bazującej na gramatyce LL(1) podczas parsingu.

Jest to jednak rozwiązanie problematyczne gdyż jest podatne na błędy, ma ograniczenia w stosunku do gramatyki, utrzymanie kodu jest trudne a wykrywanie błędów w ciągach wejściowych jest utrudnione.

Narzędzia do tworzenia analizatorów leksykalnych

JLex: A Lexical Analyzer Generator for Java (http://www.cs.princeton.edu/~appel/modern/java/jlex/)

Postać pliku konfiguracyjnego: kod użytkownika %% dyrektywy JLex %% reguły

kod użytkownika bezpośrednio kopiowany na wyjście dyrektywy JLex pozwalają wykonać odpowiedni kod w żądanym miejscu reguły reguła składa się z opcjonalnej listy stanów, wyrażenia regularnego i akcji

Przykładowe dyrektywy JLex'a

%{ <code> %} Pozwala skopiować kod do klasy: class Yylex {... <code>... }

%init{ <code> %init} Pozwala skopiwoać kod do konstruktora klasy: class Yylex { Yylex () {... <code>... } }

%eof{ <code> %eof} Pozwala skopiować kod na koniec pliku wynikowego.

%integer %intwrap Powoduje że tokeny zwracają odpowiednio wartości całkowite i obiekty typu Number (domyślnie zwracają obiekty klasy Yytoken)

Reguły JLex'a <expression> { <action> }

%% DIGIT=[0-9] LETTER=[a-zA-Z] WHITESPACE=[ \t\n] // spacja, tabulator, nowa linia // Włącza liczenie linii %line %% {LETTER}({LETTER} {DIGIT}*) {System.out.println(yyline+1 + ": Identyfikator " + yytext());} {DIGIT}+ {System.out.println(yyline+1 + ": Liczba");} "=" {System.out.println(yyline+1 + ": Przypisanie");} "==" {System.out.println(yyline+1 + ": Porównanie");} {WHITESPACE}* { }. {System.out.println(yyline+1 + ": zły znak");}

Cechy: napisany w Javie dla Javy dostępny kod źródłowy pod licencją Open Source opis gramatyki podobny do Lexa współpraca z generatorem parserów CUP wynik: klasa Yylex w pełni funkcjonalny skaner uboga dokumentacja

JFlex: The Fast Scanner Generator for Java (http://jflex.de/)

Oparty na JLex, zawiera większą w porównaniu do niego funkcjonalność (np. Liczenie kolumn). Możliwości: Zgodny składniowo z JLex Pełne wsparcie dla Unikodu Szybciej niż JLex generuje skanery Generuje skanery szybciej działąjące niż JLex (zgodnie z informacjami ze strony producenta)

Generacja różnego rodzaju skanerów (szybsze/mniejsze itp) Współpraca z generatorami parserów LALR: CUP BYacc ANTLR Licencja GPL Podświetlenie składni w Vim i XEmacs Łatwa integracja z programem ANT (odpowiednik MAKE dla Javy) Rozbudowana dokumentacja

Jax http://linux4u.jinr.ru/usoft/www/www_blackdown.org/kbs/jax.html

Cechy: Nie wspiera Unikodu Nie pozwala na definiowanie makr Składnia podobna do Lex'a

Przykład: http://linux4u.jinr.ru/usoft/www/www_blackdown.org/kbs/htmlsplit.lex

Ranking możliwości: Jax najprostrzy nie wspiera np. Makr i Unikod'u JLex funkcjonalnie podobny do Lex'a JFlex podobny do Flexa w porównaniu z JLex ma trochę większe możliwości

Generatory Parserów

ANTLR ANother Tool for Language Recognition (http://www.antlr.org/)

http://www-users.mat.uni.torun.pl/~tmpd/lgm/antlr.pdf twórcą ANTLR jest Terence Parr, który prace nad nim zapoczątkował w roku 1989. opisy gramatyk są do siebie podobne przetwarzanie języków typu LL(k) dla wszystkich wariantów gramatyk akceptacja trzech rodzajów gramatyk: parserów, lekserów oraz drzew parserów parsing metodą top-down domyślnie ANTLR generuje lekser i parser w Javie, a plik z gramatyką ma rozszerzenie.g

Gramatyki: podklasy Lexer, Parser lub TreeParser class ExprParser extends Parser; expr: mexpr ((PLUS MINUS) mexpr)* ; mexpr : atom (STAR atom)* ; atom: INT LPAREN expr RPAREN ;

Definicja operatorów i whitespace'ów w Lexerze class ExprLexer extends Lexer; options { k=2; // needed for newline junk charvocabulary='\u0000'..'\u007f'; // allow ascii } LPAREN: '(' ; RPAREN: ')' ; PLUS : '+' ; MINUS : '-' ; STAR : '*' ; INT : ('0'..'9')+ ; WS : ( ' ' '\r' '\n' '\n' '\t' ) {$settype(token.skip);} ;

JavaCC Java Compiler Compiler (https://javacc.dev.java.net/)

CECHY: Generacja parserów top-down podobieństwo JavaCC do lex/flex Specifikacja leksykalna i gramatyczna zapisywana do jednego pliku Preprocesor JJTree do budowania drzew Tworzenie dokumentachi na podstawie gramatki Obsługa Unicode Dobre raportowanie błędów oraz debuggging Sporo dokumentacji i przykładów: http://www.engr.mun.ca/~theo/javacc-faq/javacc-screen-faq.pdf

ZASTOSOWANIE: Tworzenie parserów dla: RTF, Visual Basic, Python, pliki Rational Rose mdl, XML, XML DTDs, HTML, C, C++, Java, JavaScript, Oberon, SQL, VHDL, VRML, ASN1, nagłówki e-maili itd. NIE OBSŁUGUJE: automatycznej budowy drzew -> JJTree lub JTB nie buduje tablic symboli -> parsery oparte na JavaCC brak generacji języków wyjściowych -> wyjście dla stringów z drzewa

CUP Parser Generator for Java Java(tm) Based Constructor of Useful Parsers (http://www.cs.princeton.edu/~appel/modern/java/cup/)

popularny generator parserów dla Javy pełni tą samą rolę co YACC, podobna składnia, zawiera wiele funkcji (w odróżnieniu: napisany w Javie) licencja open source współpracuje z wieloma generatorami skanerów

PRZYKŁAD GRAMATYKA WYR. ARYTM. expr_list ::= expr_list expr_part expr_part expr_part ::= expr ';' expr ::= expr '+' expr expr '-' expr expr '*' expr expr '/' expr expr '%' expr '(' expr ')' '-' expr number

Specyfikacja w CUP import java_cup.runtime.*; /* Preliminaries to set up and use the scanner. */ init with {: scanner.init(); :}; scan with {: return scanner.next_token(); :}; /* Terminals (tokens returned by the scanner). */ terminal SEMI, PLUS, MINUS, TIMES, DIVIDE, MOD; terminal UMINUS, LPAREN, RPAREN; terminal Integer NUMBER; /* Non terminals */ non terminal expr_list, expr_part; non terminal Integer expr, term, factor; /* Precedences */ precedence left PLUS, MINUS; precedence left TIMES, DIVIDE, MOD; precedence left UMINUS;

Specyfikacja w CUP (bez akcji) /* The grammar */ expr_list ::= expr_list expr_part expr_part; expr_part ::= expr SEMI; expr ::= expr PLUS expr expr MINUS expr expr TIMES expr expr DIVIDE expr expr MOD expr MINUS expr %prec UMINUS LPAREN expr RPAREN NUMBER ; Akcje: expr_part ::= expr:e {: System.out.println("= " + e); :} SEMI ; expr Wybrane narzędzia do tworzenia ::= expr:e1 PLUS expr:e2 {: RESULT = new Integer(e1.intValue() + e2.intvalue()); :} expr:e1 MINUS expr:e2 {: RESULT = new Integer(e1.intValue() - e2.intvalue()); :}...itd.

INNE? http://catalog.compilertools.net/java.html BYACC/JAVA - rozbudowa Berkeley v 1.8 YACC-compatible generatorów parserów COCO/JAVA - Java version of CoCo skaner i generator parserów. GENERIC INTERPRETER - pisanie w locie, podgląd strumienia podczas rozbudowy gramatyki JACCIE - zabawka edukacyjna do wizualizacji technik kompilacji JAX - generacja skanerów z wyrażeń regularnych, brak makr. JAY- wersja BSD Yacc, generująca kod w Javie. JB - system do generacji parserów przy pomocy Gnu Bison do Javy JELL - parsers gramatyk LL(1) JTB - Java Tree Builder, używany z generatorami parserów JavaCC LOLO - wyciąga symbole z sekwencji znaków ASCII lub Unicode; nie oparty na automacie skończonym OOPS - object-oriented parser generator zaimlementowany w Javie, sprawdza gram. W EBNF czy jest LL(1), gen. parser PAT - Package COM.stevesoft.pat kompilacja wyr. regularnych dla Perla SABLE CC. - object-oriented framework. Generacja kompilatorów i interpretatorów w Javie itd. ;)

CIEKAWE LINKI: http://en.wikipedia.org/wiki/compiler-compiler http://mindprod.com/jgloss/parser.html http://www.swtech.com/java/parser/

DZIĘKUJEMY ZA UWAGĘ. Przemysław Kantyka Patryk Orzechowski PYTANIA?