Kompilátory. Cvičenie 4: Syntaktická analýza v ANTLR4 (1. časť) Peter Kostolányi. 7. novembra 2017

Podobné dokumenty
Teória grafov. Stromy a kostry 1. časť

Konstruktory překladačů

Jemný úvod do spracovania XML

Objektovo orientované programovanie v C# ERIK KUČERA METÓDY VÝPOČTOVEJ INTELIGENCIE PREDNÁŠKA 3

Prevody z pointfree tvaru na pointwise tvar

Úvod do programovacích jazyků (Java)

Task, async, await METÓ DY VÝPOČTOVEJ INTELIGENCIE A C# FA K ULTA E L E K T ROTECHNIKY A INFORMATIKY S LOVENSKÁ T E CHNICKÁ U NIVERZITA

DALI, pomoc a riešenia

Tvorba logického a fyzického dátového modelu relačnej databázy pomocou nástrojov od firmy Oracle výukový tutoriál

Čo je to Refactoring?

Databázové systémy. Dátové modelovanie - relačný model

OXICO. jazykové knihy. ponuka platí do

Štruktúra údajov pre kontajner XML údajov 1. Dátové prvky pre kontajner XML údajov

MQL4. MQL4 MQL4 MQL4 MQL4 MQL4 Script MQL4 MQL4 MQL4 MQL4 MQL4 MQL4 MQL4 MQL4. MQL4 MQL4 MQL4 MQL4 Indicator MQL4 MQL4 MQL4 MQL4 MQL4 EA

Produktovo-skupinová inzercia so spoločnosťou Google v spolupráci s ASData a BlueWinston.

SLOVENSKÁ TECHNICKÁ UNIVERZITA V BRATISLAVE FAKULTA INFORMATIKY A INFORMAČNÝCH TECHNOLÓGIÍ. Metodika verzií zdrojového kódu

Všeobecne záväzné nariadenie Mesta Trenčianske Teplice č. x/2016 o používaní pyrotechnických výrobkov na území mesta Trenčianske Teplice

Import Excel Univerzál

Ako sme postavili Benátky

Úvod do programovacích jazyků (Java)

ŠTATISTIKA V EXCELI 2007

Stiga Autoclip 200 Series

1. Formát exportov typu *.gpc (ABO)

Hromadná korešpondencia v programe Word Lektor: Ing. Jaroslav Mišovych

U N I V E R Z I N S K Á I T A I L V E R E N L N T A S O

Moderné vzdelávanie pre vedomostnú spoločnosť/projekt je spolufinancovaný zo zdrojov EÚ. Grafy

Vážení používatelia programu WISP.

Studentove t-testy. Metódy riešenia matematických úloh

Metóda vetiev a hraníc (Branch and Bound Method)

Microsoft Project CVIČENIE 6 1

Zdroje technických problémov. Zdroj: 14. Symposium Thermische Solaranlagen, Kloster Banz, Mai 2004 Christian Keilholz, Fa.

Zvyškové triedy podľa modulu

Základy algoritmizácie a programovania

MANUÁL K TVORBE CVIČENÍ NA ÚLOHY S POROZUMENÍM

Čo ak program potrebuje pamäť, ktorej veľkosť závisí od konkrétneho vstupu?

NEVLASTNÁ VODIVOSŤ POLOVODIČOVÉHO MATERIÁLU TYPU P

Osoba podľa 8 zákona finančné limity, pravidlá a postupy platné od

Obrázok Časový plán projektu, určite kritickú cestu. Obrázok Časový plán projektu, určite kritickú cestu

8. Relácia usporiadania

MATLAB (1) - úvod do programovania vedeckých problémov. LS 2017, 8.predn.

Z. Kotala, P. Toman: Java ( Obsah )

Dopravné značky. Pracovné listy na rozvoj slovnej zásoby a komunikačných schopností pre prípravný a 1. ročník ZŠ. Mgr. Jana Maláková 2014

Naformátuj to. Naformátuj to. pre samoukov

Programovanie.NET, C++ - najbližšie termíny:

Pracovné prostredie MS EXCEL 2003.

Riešenie cvičení z 3. kapitoly

Node root; } riešenia príkladu 1 píšte na tento list alebo si vypýtajte ďalší list

BusinessBanking Lite a SEPA Uistite sa, že ste pripravení

Výučbový systém SOCRATIVE

Entitno - relačný model. Jaroslav Porubän, Miroslav Biňas, Milan Nosáľ (c)

PLA-401 v3 Ethernetový adaptér PowerLine (prenos dát cez silové elektrické káble)

Operačný systém Úvodná prednáška

Krok 1 Pochopenie systémov. Krok 2 Hodnotenie silných a slabých stránok. Krok 3 Zber podkladov. - hodnotenie - overenie - postupy a smernice

INTERNET BANKING. Popis štruktúry technických formátov exportných súborov VŠETKO, ČO JE MOŽNÉ. with.vub.sk,

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

MATURITA 2016 ZÁKLADNÉ INFORMÁCIE

PROGRAM VZDELÁVACEJ ČINNOSTI. Anotácia predmetu

Program "Inventúra program.xlsm"

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

Textový editor WORD. Práca s obrázkami a automatickými tvarmi vo Worde

Funkcia - priradenie (predpis), ktoré každému prvku z množiny D priraďuje práve jeden prvok množiny H.

Podlimitná zákazka Verejný obstarávateľ

PODPROGRAMY. Vyčlenenie podprogramu a jeho pomenovanie robíme v deklarácii programu a aktiváciu vykonáme volaním podprogramu.

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

Porovnanie dizajnu časopisu

Technická univerzita v Košiciach

Erasmus+ Online jazyková podpora (OLS) Využite svoj pobyt Erasmus+ naplno!

Úroveň strojového kódu procesor Intel Pentium. Adresovanie pamäte

Kvadratické funkcie, rovnice, 1

Multiplexor a demultiplexor

Iracionálne rovnice = 14 = ±

2. PRIDANIE ZÁVEREČNEJ PRÁCE DO EVIDENCIE ZÁVEREČNÝCH PRÁC (EZP) A OZNAČENIE PRÁCE AKO FINÁLNEJ.

OBCHOD MARKETING PSYCHOLÓGIA A ETIKA PREDAJA

Import cenových akcií FRESH

Diplomový projekt. Detská univerzita Žilinská univerzita v Žiline Matilda Drozdová

Organizačné štruktúry.

Algoritmizace a programování

TESTOVANIE SOFTVÉRU MANUÁLNE

Microsoft Outlook. Stručný prehľad základných funkcií. Ing.Anna Grejtáková, SPP DFBERG

Nebezpečné látky a ich rozdelenie

DIZAJN MANUÁL KULT MINOR LOGO MANUÁL. Fond na podporu kultúry národnostných menšín

Krížovka. Hot Potatoes JCross ( červená farba) = vytvorenie krížovky, do ktorej vpisujeme odpovede na zadané otázky. Priradenie

Verifikácia a falzifikácia

VYSPORIADANIE PREHRADENÝCH ZÁVÄZKOV A POHĽADÁVOK

Kombinatorická pravdepodobnosť (opakovanie)

IP Adresa. Marián Opiela 1.E

Právna úprava -,,kde čo nájsť? Typy účastníkov (vrátane definície MSP)

Návrh postupu pre stanovenie počtu odborných zástupcov na prevádzkovanie verejných vodovodov a verejných kanalizácií v správe vodárenských spoločnosti

Informačný list 1. Čo je energia? Všetci potrebujeme energiu! Energia doma

TESTOVANIE ASYMETRIE EKONOMICKÝCH ČASOVÝCH RADOV MARIÁN VÁVRA ZACHARIAS PSARADAKIS NETECHNICKÉ

Metodické usmernenie č. 4/2007 k poskytovaniu informácií prostredníctvom portálu Úradu pre dohľad nad zdravotnou starostlivosťou

SOCIÁLNY ASPEKT VO VEREJNOM OBSTARÁVANÍ : SKÚSENOSTI ZO SLOVENSKA

AKADEMICKÝ INFORMAČNÝ SYSTÉM

Matematika Postupnosti

Extrémne programovanie a iné agilné metodológie Zimný semester 2007/08

Rigips 4PROfesional. Viditeľne lepšie sadrokartónové dosky so zárukou rovinného povrchu konštrukcií UŽ ZAJTRA BEZ VIDITEĽNÝCH SPOJOV DOSIEK

Finančný manažment, finančná matematika a účtovníctvo

POUŽÍVATEĽSKÁ PRÍRUČKA KU KONTROLE KUPÓNOV LE CHEQUE DEJEUNER s.r.o. NA WEBE

7.CVIČENIE. Základy HTML

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

Transkript:

Kompilátory Cvičenie 4: Syntaktická analýza v ANTLR4 (1. časť) Peter Kostolányi 7. novembra 2017

ANTLR: základné princípy (opakovanie)

ANTLR: základné princípy (opakovanie) Vstup: gramatika v metajazyku ANTLR4

ANTLR: základné princípy (opakovanie) Vstup: gramatika v metajazyku ANTLR4 Typicky ide o súbor s príponou.g4 alebo.g

ANTLR: základné princípy (opakovanie) Vstup: gramatika v metajazyku ANTLR4 Typicky ide o súbor s príponou.g4 alebo.g 1 lexer grammar Vyrazy; 3 LEFT : ( 5 ; 7 RIGHT : ) 9 ; 11 MUL : * 13 ; 15 DIV : / 17 ; ADD 20 : + ; 22 SUB 24 : - ; 26 INT 28 : DIGIT + ; 30 WS 32 : [ \t\n\r]+ -> skip ; 34 fragment DIGIT 36 : [0-9] ;

ANTLR: základné princípy (opakovanie) Vstup: gramatika v metajazyku ANTLR4 Typicky ide o súbor s príponou.g4 alebo.g 1 grammar Vyrazy; 3 expr : expr op =( MUL DIV ) expr 5 expr op =( ADD SUB ) expr ( expr ) 7 INT 9 MUL ; 11 : * ; 13 DIV 15 : / ; 17 18 ADD : + 20 ; 22 SUB : - 24 ; 26 INT : DIGIT + 28 ; 30 WS : [ \t\n\r]+ -> skip 32 ; 34 fragment DIGIT : [0-9] 36 ;

ANTLR: základné princípy (opakovanie) Vyrazy.g4 lexer grammar Vyrazy;... antlr4 Vyrazy.java Vyrazy.tokens???.java javac + grun VyrazyLexer.java Vyrazy.g4 VyrazyParser.java grammar Vyrazy;... antlr4 VyrazyListener.java VyrazyBaseListener.java Vyrazy.tokens???.java javac + grun VyrazyLexer.tokens (...)

ANTLR: základné princípy (opakovanie) Vyrazy.g4 lexer grammar Vyrazy;... antlr4 Vyrazy.java Vyrazy.tokens???.java javac + grun VyrazyLexer.java Vyrazy.g4 VyrazyParser.java grammar Vyrazy;... antlr4 VyrazyListener.java VyrazyBaseListener.java Vyrazy.tokens???.java javac + grun VyrazyLexer.tokens (...)

ANTLR: základné princípy (opakovanie) Vyrazy.g4 lexer grammar Vyrazy;... antlr4 Vyrazy.java Vyrazy.tokens???.java javac + grun VyrazyLexer.java Vyrazy.g4 VyrazyParser.java grammar Vyrazy;... antlr4 VyrazyListener.java VyrazyBaseListener.java Vyrazy.tokens???.java javac + grun VyrazyLexer.tokens (...)

ANTLR: základné princípy (opakovanie) Vyrazy.g4 lexer grammar Vyrazy;... antlr4 Vyrazy.java Vyrazy.tokens???.java javac + grun VyrazyLexer.java Vyrazy.g4 VyrazyParser.java grammar Vyrazy;... antlr4 VyrazyListener.java VyrazyBaseListener.java Vyrazy.tokens???.java javac + grun VyrazyLexer.tokens (...)

ANTLR: základné princípy (opakovanie) Vyrazy.g4 lexer grammar Vyrazy;... antlr4 Vyrazy.java Vyrazy.tokens???.java javac + grun VyrazyLexer.java Vyrazy.g4 VyrazyParser.java grammar Vyrazy;... antlr4 VyrazyListener.java VyrazyBaseListener.java Vyrazy.tokens???.java javac + grun VyrazyLexer.tokens (...)

Viacznačnosť a ľavá rekurzia Uvažujme napríklad nasledujúcu časť gramatiky pre aritmetické výrazy:

Viacznačnosť a ľavá rekurzia Uvažujme napríklad nasledujúcu časť gramatiky pre aritmetické výrazy: 1 expr : expr ( MUL DIV ) expr 3 expr ( ADD SUB ) expr LEFT expr RIGHT 5 SUB LEFT expr RIGHT NUM 7 SUB NUM ;

Viacznačnosť a ľavá rekurzia Uvažujme napríklad nasledujúcu časť gramatiky pre aritmetické výrazy: 1 expr : expr ( MUL DIV ) expr 3 expr ( ADD SUB ) expr LEFT expr RIGHT 5 SUB LEFT expr RIGHT NUM 7 SUB NUM ; Takáto definícia je viacznačná

Viacznačnosť a ľavá rekurzia Uvažujme napríklad nasledujúcu časť gramatiky pre aritmetické výrazy: 1 expr : expr ( MUL DIV ) expr 3 expr ( ADD SUB ) expr LEFT expr RIGHT 5 SUB LEFT expr RIGHT NUM 7 SUB NUM ; Takáto definícia je viacznačná Existujú napríklad dve odvodenia pre 2 + 2 2

Viacznačnosť a ľavá rekurzia Uvažujme napríklad nasledujúcu časť gramatiky pre aritmetické výrazy: 1 expr : expr ( MUL DIV ) expr 3 expr ( ADD SUB ) expr LEFT expr RIGHT 5 SUB LEFT expr RIGHT NUM 7 SUB NUM ; Takáto definícia je viacznačná Existujú napríklad dve odvodenia pre 2 + 2 2 Definícia je tiež ľavo rekurzívna, čo pri parsovaní zhora nadol predstavuje problém

Viacznačnosť a ľavá rekurzia ANTLR4 vie automaticky odstrániť bezprostrednú ľavú rekurziu:

Viacznačnosť a ľavá rekurzia ANTLR4 vie automaticky odstrániť bezprostrednú ľavú rekurziu: Tá postačuje na popis väčšiny v praxi sa vyskytujúcich konštrukcií

Viacznačnosť a ľavá rekurzia ANTLR4 vie automaticky odstrániť bezprostrednú ľavú rekurziu: Tá postačuje na popis väčšiny v praxi sa vyskytujúcich konštrukcií Viac o tejto transformácii na budúcom cvičení

Viacznačnosť a ľavá rekurzia ANTLR4 vie automaticky odstrániť bezprostrednú ľavú rekurziu: Tá postačuje na popis väčšiny v praxi sa vyskytujúcich konštrukcií Viac o tejto transformácii na budúcom cvičení Automatické zjednoznačnenie viacznačnej gramatiky:

Viacznačnosť a ľavá rekurzia ANTLR4 vie automaticky odstrániť bezprostrednú ľavú rekurziu: Tá postačuje na popis väčšiny v praxi sa vyskytujúcich konštrukcií Viac o tejto transformácii na budúcom cvičení Automatické zjednoznačnenie viacznačnej gramatiky: Vhodné pre gramatiky popisujúce nejaký druh výrazov

Viacznačnosť a ľavá rekurzia ANTLR4 vie automaticky odstrániť bezprostrednú ľavú rekurziu: Tá postačuje na popis väčšiny v praxi sa vyskytujúcich konštrukcií Viac o tejto transformácii na budúcom cvičení Automatické zjednoznačnenie viacznačnej gramatiky: Vhodné pre gramatiky popisujúce nejaký druh výrazov Používa metódu známu ako precedence climbing

Viacznačnosť a ľavá rekurzia ANTLR4 vie automaticky odstrániť bezprostrednú ľavú rekurziu: Tá postačuje na popis väčšiny v praxi sa vyskytujúcich konštrukcií Viac o tejto transformácii na budúcom cvičení Automatické zjednoznačnenie viacznačnej gramatiky: Vhodné pre gramatiky popisujúce nejaký druh výrazov Používa metódu známu ako precedence climbing Pre konštrukcie iné ako výrazy je odporúčané riešiť viacznačnosť manuálne (zmenou gramatiky alebo pridaním predikátov)

Viacznačnosť a ľavá rekurzia ANTLR4 vie automaticky odstrániť bezprostrednú ľavú rekurziu: Tá postačuje na popis väčšiny v praxi sa vyskytujúcich konštrukcií Viac o tejto transformácii na budúcom cvičení Automatické zjednoznačnenie viacznačnej gramatiky: Vhodné pre gramatiky popisujúce nejaký druh výrazov Používa metódu známu ako precedence climbing Pre konštrukcie iné ako výrazy je odporúčané riešiť viacznačnosť manuálne (zmenou gramatiky alebo pridaním predikátov) ANTLR4 identifikuje štyri typy rekurzívnych vzorov :

Viacznačnosť a ľavá rekurzia ANTLR4 vie automaticky odstrániť bezprostrednú ľavú rekurziu: Tá postačuje na popis väčšiny v praxi sa vyskytujúcich konštrukcií Viac o tejto transformácii na budúcom cvičení Automatické zjednoznačnenie viacznačnej gramatiky: Vhodné pre gramatiky popisujúce nejaký druh výrazov Používa metódu známu ako precedence climbing Pre konštrukcie iné ako výrazy je odporúčané riešiť viacznačnosť manuálne (zmenou gramatiky alebo pridaním predikátov) ANTLR4 identifikuje štyri typy rekurzívnych vzorov : Binárny: expr op expr

Viacznačnosť a ľavá rekurzia ANTLR4 vie automaticky odstrániť bezprostrednú ľavú rekurziu: Tá postačuje na popis väčšiny v praxi sa vyskytujúcich konštrukcií Viac o tejto transformácii na budúcom cvičení Automatické zjednoznačnenie viacznačnej gramatiky: Vhodné pre gramatiky popisujúce nejaký druh výrazov Používa metódu známu ako precedence climbing Pre konštrukcie iné ako výrazy je odporúčané riešiť viacznačnosť manuálne (zmenou gramatiky alebo pridaním predikátov) ANTLR4 identifikuje štyri typy rekurzívnych vzorov : Binárny: expr op expr Ternárny: expr op1 expr op2 expr

Viacznačnosť a ľavá rekurzia ANTLR4 vie automaticky odstrániť bezprostrednú ľavú rekurziu: Tá postačuje na popis väčšiny v praxi sa vyskytujúcich konštrukcií Viac o tejto transformácii na budúcom cvičení Automatické zjednoznačnenie viacznačnej gramatiky: Vhodné pre gramatiky popisujúce nejaký druh výrazov Používa metódu známu ako precedence climbing Pre konštrukcie iné ako výrazy je odporúčané riešiť viacznačnosť manuálne (zmenou gramatiky alebo pridaním predikátov) ANTLR4 identifikuje štyri typy rekurzívnych vzorov : Binárny: expr op expr Ternárny: expr op1 expr op2 expr Prefixový: niečo expr

Viacznačnosť a ľavá rekurzia ANTLR4 vie automaticky odstrániť bezprostrednú ľavú rekurziu: Tá postačuje na popis väčšiny v praxi sa vyskytujúcich konštrukcií Viac o tejto transformácii na budúcom cvičení Automatické zjednoznačnenie viacznačnej gramatiky: Vhodné pre gramatiky popisujúce nejaký druh výrazov Používa metódu známu ako precedence climbing Pre konštrukcie iné ako výrazy je odporúčané riešiť viacznačnosť manuálne (zmenou gramatiky alebo pridaním predikátov) ANTLR4 identifikuje štyri typy rekurzívnych vzorov : Binárny: expr op expr Ternárny: expr op1 expr op2 expr Prefixový: niečo expr Sufixový: expr niečo

Viacznačnosť a ľavá rekurzia ANTLR4 vie automaticky odstrániť bezprostrednú ľavú rekurziu: Tá postačuje na popis väčšiny v praxi sa vyskytujúcich konštrukcií Viac o tejto transformácii na budúcom cvičení Automatické zjednoznačnenie viacznačnej gramatiky: Vhodné pre gramatiky popisujúce nejaký druh výrazov Používa metódu známu ako precedence climbing Pre konštrukcie iné ako výrazy je odporúčané riešiť viacznačnosť manuálne (zmenou gramatiky alebo pridaním predikátov) ANTLR4 identifikuje štyri typy rekurzívnych vzorov : Binárny: expr op expr Ternárny: expr op1 expr op2 expr Prefixový: niečo expr Sufixový: expr niečo Skôr uvedená alternatíva vyššia precedencia operátorov

Viacznačnosť a ľavá rekurzia ANTLR4 vie automaticky odstrániť bezprostrednú ľavú rekurziu: Tá postačuje na popis väčšiny v praxi sa vyskytujúcich konštrukcií Viac o tejto transformácii na budúcom cvičení Automatické zjednoznačnenie viacznačnej gramatiky: Vhodné pre gramatiky popisujúce nejaký druh výrazov Používa metódu známu ako precedence climbing Pre konštrukcie iné ako výrazy je odporúčané riešiť viacznačnosť manuálne (zmenou gramatiky alebo pridaním predikátov) ANTLR4 identifikuje štyri typy rekurzívnych vzorov : Binárny: expr op expr Ternárny: expr op1 expr op2 expr Prefixový: niečo expr Sufixový: expr niečo Skôr uvedená alternatíva vyššia precedencia operátorov Alternatívy nezodpovedajúce žiadnemu vzoru sa považujú za primárne výrazy :

Viacznačnosť a ľavá rekurzia ANTLR4 vie automaticky odstrániť bezprostrednú ľavú rekurziu: Tá postačuje na popis väčšiny v praxi sa vyskytujúcich konštrukcií Viac o tejto transformácii na budúcom cvičení Automatické zjednoznačnenie viacznačnej gramatiky: Vhodné pre gramatiky popisujúce nejaký druh výrazov Používa metódu známu ako precedence climbing Pre konštrukcie iné ako výrazy je odporúčané riešiť viacznačnosť manuálne (zmenou gramatiky alebo pridaním predikátov) ANTLR4 identifikuje štyri typy rekurzívnych vzorov : Binárny: expr op expr Ternárny: expr op1 expr op2 expr Prefixový: niečo expr Sufixový: expr niečo Skôr uvedená alternatíva vyššia precedencia operátorov Alternatívy nezodpovedajúce žiadnemu vzoru sa považujú za primárne výrazy : NUM

Viacznačnosť a ľavá rekurzia ANTLR4 vie automaticky odstrániť bezprostrednú ľavú rekurziu: Tá postačuje na popis väčšiny v praxi sa vyskytujúcich konštrukcií Viac o tejto transformácii na budúcom cvičení Automatické zjednoznačnenie viacznačnej gramatiky: Vhodné pre gramatiky popisujúce nejaký druh výrazov Používa metódu známu ako precedence climbing Pre konštrukcie iné ako výrazy je odporúčané riešiť viacznačnosť manuálne (zmenou gramatiky alebo pridaním predikátov) ANTLR4 identifikuje štyri typy rekurzívnych vzorov : Binárny: expr op expr Ternárny: expr op1 expr op2 expr Prefixový: niečo expr Sufixový: expr niečo Skôr uvedená alternatíva vyššia precedencia operátorov Alternatívy nezodpovedajúce žiadnemu vzoru sa považujú za primárne výrazy : NUM LEFT expr RIGHT

Viacznačnosť a ľavá rekurzia ANTLR4 vie automaticky odstrániť bezprostrednú ľavú rekurziu: Tá postačuje na popis väčšiny v praxi sa vyskytujúcich konštrukcií Viac o tejto transformácii na budúcom cvičení Automatické zjednoznačnenie viacznačnej gramatiky: Vhodné pre gramatiky popisujúce nejaký druh výrazov Používa metódu známu ako precedence climbing Pre konštrukcie iné ako výrazy je odporúčané riešiť viacznačnosť manuálne (zmenou gramatiky alebo pridaním predikátov) ANTLR4 identifikuje štyri typy rekurzívnych vzorov : Binárny: expr op expr Ternárny: expr op1 expr op2 expr Prefixový: niečo expr Sufixový: expr niečo Skôr uvedená alternatíva vyššia precedencia operátorov Alternatívy nezodpovedajúce žiadnemu vzoru sa považujú za primárne výrazy : NUM LEFT expr RIGHT...

Použitie ANTLR4 a nástroja TestRig Gramatiku možno otestovať volaním grun s vhodnými parametrami:

Použitie ANTLR4 a nástroja TestRig Gramatiku možno otestovať volaním grun s vhodnými parametrami: 1 a n t l r 4 NazovGramatiky. g4 2 javac. java 3 grun NazovGramatiky po cia to cnyneterminal tokens 4 grun NazovGramatiky po cia to cnyneterminal t r e e 5 grun NazovGramatiky po cia to cnyneterminal ps strom. ps 6 grun NazovGramatiky po cia to cnyneterminal g ui 7 grun NazovGramatiky po cia to cnyneterminal g ui vstup. in

Importovanie gramatík Veľké gramatiky je často vhodné rozdeliť na viac častí

Importovanie gramatík Veľké gramatiky je často vhodné rozdeliť na viac častí Príkaz na importovanie pravidiel z inej gramatiky: import Gramatika;

Importovanie gramatík Veľké gramatiky je často vhodné rozdeliť na viac častí Príkaz na importovanie pravidiel z inej gramatiky: import Gramatika; Vhodné napríklad na oddelenie syntaktických a lexikálnych pravidiel

Importovanie gramatík Veľké gramatiky je často vhodné rozdeliť na viac častí Príkaz na importovanie pravidiel z inej gramatiky: import Gramatika; Vhodné napríklad na oddelenie syntaktických a lexikálnych pravidiel V prípade konfliktu má definícia v importujúcej gramatike prednosť pred definíciou v importovanej gramatike

Integrácia vygenerovaného parsera do vlastného programu Základ programu využívajúceho vygenerovaný parser:

Integrácia vygenerovaného parsera do vlastného programu Základ programu využívajúceho vygenerovaný parser: 1 import org. a n t l r. v4. runtime. ; import org. a n t l r. v4. runtime. t r e e. ; 3 import java. i o. ; import java. u t i l. ; 5 public cl ass Hlavna { 7 public static void main ( S t r i n g [ ] a r g s ) throws Exception { 9 InputStream i s = System. in ; i f ( a r g s. length > 0) { 11 i s = new FileInputStream ( a r g s [ 0 ] ) ; } 13 CharStream input = CharStreams. fromstream ( i s ) ; GramatikaLexer l e x e r = new GramatikaLexer ( input ) ; 15 CommonTokenStream tokens = new CommonTokenStream( l e x e r ) ; GramatikaParser p a r s e r = new GramatikaParser ( tokens ) ; 17 19 } ParseTree t r e e = p a r s e r. pociatocnyneterminal ( ) ; 21 }

Kontexty neterminálov Pre každý neterminál neterminal obsahuje trieda GramatikaParser statickú podtriedu NeterminalContext:

Kontexty neterminálov Pre každý neterminál neterminal obsahuje trieda GramatikaParser statickú podtriedu NeterminalContext: Inštancia takejto triedy reprezentuje výskyt daného neterminálu v syntaktickom strome

Kontexty neterminálov Pre každý neterminál neterminal obsahuje trieda GramatikaParser statickú podtriedu NeterminalContext: Inštancia takejto triedy reprezentuje výskyt daného neterminálu v syntaktickom strome Každá z tried NeterminalContext dedí od ParserRuleContext

Kontexty neterminálov Pre každý neterminál neterminal obsahuje trieda GramatikaParser statickú podtriedu NeterminalContext: Inštancia takejto triedy reprezentuje výskyt daného neterminálu v syntaktickom strome Každá z tried NeterminalContext dedí od ParserRuleContext ParserRuleContext okrem iného implementuje ParseTree

Kontexty neterminálov Pre každý neterminál neterminal obsahuje trieda GramatikaParser statickú podtriedu NeterminalContext: Inštancia takejto triedy reprezentuje výskyt daného neterminálu v syntaktickom strome Každá z tried NeterminalContext dedí od ParserRuleContext ParserRuleContext okrem iného implementuje ParseTree Na kontext sa teda možno dívať aj ako na celý podstrom zakorenený v danom netermináli

Kontexty neterminálov Pre každý neterminál neterminal obsahuje trieda GramatikaParser statickú podtriedu NeterminalContext: Inštancia takejto triedy reprezentuje výskyt daného neterminálu v syntaktickom strome Každá z tried NeterminalContext dedí od ParserRuleContext ParserRuleContext okrem iného implementuje ParseTree Na kontext sa teda možno dívať aj ako na celý podstrom zakorenený v danom netermináli Metódy neterminal() definované v GramatikaParser vracajú inštancie triedy NeterminalContext

Kontexty neterminálov Pre každý neterminál neterminal obsahuje trieda GramatikaParser statickú podtriedu NeterminalContext: Inštancia takejto triedy reprezentuje výskyt daného neterminálu v syntaktickom strome Každá z tried NeterminalContext dedí od ParserRuleContext ParserRuleContext okrem iného implementuje ParseTree Na kontext sa teda možno dívať aj ako na celý podstrom zakorenený v danom netermináli Metódy neterminal() definované v GramatikaParser vracajú inštancie triedy NeterminalContext Triedy NeterminalContext majú definované metódy na prístup k ich deťom (ich definície možno nájsť priamo v súbore GramatikaParser.java)

Traverzovanie syntaktického stromu: Listener ANTLR4 Runtime API obsahuje triedu ParseTreeWalker

Traverzovanie syntaktického stromu: Listener ANTLR4 Runtime API obsahuje triedu ParseTreeWalker Tá obsahuje metódu, ktorá pretraverzuje strom prehľadávaním do hĺbky (vždy pre najľavejšie dieťa): void walk(parsetreelistener listener, ParseTree t)

Traverzovanie syntaktického stromu: Listener ANTLR4 Runtime API obsahuje triedu ParseTreeWalker Tá obsahuje metódu, ktorá pretraverzuje strom prehľadávaním do hĺbky (vždy pre najľavejšie dieťa): void walk(parsetreelistener listener, ParseTree t) Volaním antlr4 Gramatika.g4 sú okrem iného vytvorené:

Traverzovanie syntaktického stromu: Listener ANTLR4 Runtime API obsahuje triedu ParseTreeWalker Tá obsahuje metódu, ktorá pretraverzuje strom prehľadávaním do hĺbky (vždy pre najľavejšie dieťa): void walk(parsetreelistener listener, ParseTree t) Volaním antlr4 Gramatika.g4 sú okrem iného vytvorené: Rozhranie GramatikaListener dediace od ParseTreeListener

Traverzovanie syntaktického stromu: Listener ANTLR4 Runtime API obsahuje triedu ParseTreeWalker Tá obsahuje metódu, ktorá pretraverzuje strom prehľadávaním do hĺbky (vždy pre najľavejšie dieťa): void walk(parsetreelistener listener, ParseTree t) Volaním antlr4 Gramatika.g4 sú okrem iného vytvorené: Rozhranie GramatikaListener dediace od ParseTreeListener Trieda GramatikaBaseListener implementujúca GramatikaListener

Traverzovanie syntaktického stromu: Listener ANTLR4 Runtime API obsahuje triedu ParseTreeWalker Tá obsahuje metódu, ktorá pretraverzuje strom prehľadávaním do hĺbky (vždy pre najľavejšie dieťa): void walk(parsetreelistener listener, ParseTree t) Volaním antlr4 Gramatika.g4 sú okrem iného vytvorené: Rozhranie GramatikaListener dediace od ParseTreeListener Trieda GramatikaBaseListener implementujúca GramatikaListener GramatikaBaseListener obsahuje východzie (prázdne) implementácie metód reagujúcich na objavenie a opustenie vrchola stromu

Traverzovanie syntaktického stromu: Listener ANTLR4 Runtime API obsahuje triedu ParseTreeWalker Tá obsahuje metódu, ktorá pretraverzuje strom prehľadávaním do hĺbky (vždy pre najľavejšie dieťa): void walk(parsetreelistener listener, ParseTree t) Volaním antlr4 Gramatika.g4 sú okrem iného vytvorené: Rozhranie GramatikaListener dediace od ParseTreeListener Trieda GramatikaBaseListener implementujúca GramatikaListener GramatikaBaseListener obsahuje východzie (prázdne) implementácie metód reagujúcich na objavenie a opustenie vrchola stromu Od GramatikaBaseListener môže dediť trieda obsahujúca ozajstné implementácie týchto metód

Traverzovanie syntaktického stromu: Listener ANTLR4 Runtime API obsahuje triedu ParseTreeWalker Tá obsahuje metódu, ktorá pretraverzuje strom prehľadávaním do hĺbky (vždy pre najľavejšie dieťa): void walk(parsetreelistener listener, ParseTree t) Volaním antlr4 Gramatika.g4 sú okrem iného vytvorené: Rozhranie GramatikaListener dediace od ParseTreeListener Trieda GramatikaBaseListener implementujúca GramatikaListener GramatikaBaseListener obsahuje východzie (prázdne) implementácie metód reagujúcich na objavenie a opustenie vrchola stromu Od GramatikaBaseListener môže dediť trieda obsahujúca ozajstné implementácie týchto metód Vďaka rozdeleniu na rozhranie a bazálnu triedu stačí implementovať metódy, kde treba niečo robiť

Traverzovanie syntaktického stromu: Listener ANTLR4 Runtime API obsahuje triedu ParseTreeWalker Tá obsahuje metódu, ktorá pretraverzuje strom prehľadávaním do hĺbky (vždy pre najľavejšie dieťa): void walk(parsetreelistener listener, ParseTree t) Volaním antlr4 Gramatika.g4 sú okrem iného vytvorené: Rozhranie GramatikaListener dediace od ParseTreeListener Trieda GramatikaBaseListener implementujúca GramatikaListener GramatikaBaseListener obsahuje východzie (prázdne) implementácie metód reagujúcich na objavenie a opustenie vrchola stromu Od GramatikaBaseListener môže dediť trieda obsahujúca ozajstné implementácie týchto metód Vďaka rozdeleniu na rozhranie a bazálnu triedu stačí implementovať metódy, kde treba niečo robiť Pozor: triedu GramatikaBaseListener využívať len na dedenie ( premaže sa pri každom volaní antlr4)

Označenie alternatív Alternatívy pre každý neterminál možno označiť :

Označenie alternatív Alternatívy pre každý neterminál možno označiť : 1 expr : expr ( MUL DIV ) expr # BinOp 3 expr ( ADD SUB ) expr # BinOp LEFT expr RIGHT # Paren 5 SUB LEFT expr RIGHT # NegParen NUM # Number 7 SUB NUM # NegNumber ;

Označenie alternatív Alternatívy pre každý neterminál možno označiť : 1 expr : expr ( MUL DIV ) expr # BinOp 3 expr ( ADD SUB ) expr # BinOp LEFT expr RIGHT # Paren 5 SUB LEFT expr RIGHT # NegParen NUM # Number 7 SUB NUM # NegNumber ; Kontexty sú vytvorené ku každej značke

Označenie alternatív Alternatívy pre každý neterminál možno označiť : 1 expr : expr ( MUL DIV ) expr # BinOp 3 expr ( ADD SUB ) expr # BinOp LEFT expr RIGHT # Paren 5 SUB LEFT expr RIGHT # NegParen NUM # Number 7 SUB NUM # NegNumber ; Kontexty sú vytvorené ku každej značke Listener potom tiež obsahuje metódy pre každý kontext

Označenie alternatív Alternatívy pre každý neterminál možno označiť : 1 expr : expr ( MUL DIV ) expr # BinOp 3 expr ( ADD SUB ) expr # BinOp LEFT expr RIGHT # Paren 5 SUB LEFT expr RIGHT # NegParen NUM # Number 7 SUB NUM # NegNumber ; Kontexty sú vytvorené ku každej značke Listener potom tiež obsahuje metódy pre každý kontext Pre každý neterminál treba označiť buď všetky alternatívy, alebo žiadnu alternatívu

Pomenovanie prvkov pravidla Prvky pravidla možno pomenovať pre jednoduchšiu referenciu

Pomenovanie prvkov pravidla Prvky pravidla možno pomenovať pre jednoduchšiu referenciu Typicky ide o pomenovanie jedného výskytu neterminálu alebo alternatívy medzi tokenmi

Pomenovanie prvkov pravidla Prvky pravidla možno pomenovať pre jednoduchšiu referenciu Typicky ide o pomenovanie jedného výskytu neterminálu alebo alternatívy medzi tokenmi K danému pomenovaniu je následne vytvorený atribút zodpovedajúcej kontextovej triedy (ide o inštanciu inej kontextovej triedy alebo o inštanciu triedy Token)

Pomenovanie prvkov pravidla Prvky pravidla možno pomenovať pre jednoduchšiu referenciu Typicky ide o pomenovanie jedného výskytu neterminálu alebo alternatívy medzi tokenmi K danému pomenovaniu je následne vytvorený atribút zodpovedajúcej kontextovej triedy (ide o inštanciu inej kontextovej triedy alebo o inštanciu triedy Token) 1 expr : expr op =( MUL DIV ) expr # BinOp 3 expr op =( ADD SUB ) expr # BinOp LEFT expr RIGHT # Paren 5 SUB LEFT expr RIGHT # NegParen NUM # Number 7 SUB NUM # NegNumber ;

Traverzovanie syntaktického stromu: Visitor Silnejšia metóda traverzovania stromov

Traverzovanie syntaktického stromu: Visitor Silnejšia metóda traverzovania stromov Navštívené podstromy sú špecifikované programátorom (už teda nemusí ísť len o prehľadávanie do hĺbky)

Traverzovanie syntaktického stromu: Visitor Silnejšia metóda traverzovania stromov Navštívené podstromy sú špecifikované programátorom (už teda nemusí ísť len o prehľadávanie do hĺbky) Metódy na návštevu podstromov vracajú na výstupe objekty nejakého typu

Traverzovanie syntaktického stromu: Visitor Silnejšia metóda traverzovania stromov Navštívené podstromy sú špecifikované programátorom (už teda nemusí ísť len o prehľadávanie do hĺbky) Metódy na návštevu podstromov vracajú na výstupe objekty nejakého typu To umožňuje implementovať vyhodnocovanie atribútov a podobne

Traverzovanie syntaktického stromu: Visitor Silnejšia metóda traverzovania stromov Navštívené podstromy sú špecifikované programátorom (už teda nemusí ísť len o prehľadávanie do hĺbky) Metódy na návštevu podstromov vracajú na výstupe objekty nejakého typu To umožňuje implementovať vyhodnocovanie atribútov a podobne Na vytvorenie tried pre Visitor namiesto tried pre Listener :

Traverzovanie syntaktického stromu: Visitor Silnejšia metóda traverzovania stromov Navštívené podstromy sú špecifikované programátorom (už teda nemusí ísť len o prehľadávanie do hĺbky) Metódy na návštevu podstromov vracajú na výstupe objekty nejakého typu To umožňuje implementovať vyhodnocovanie atribútov a podobne Na vytvorenie tried pre Visitor namiesto tried pre Listener : 1 a n t l r 4 v i s i t o r no l i s t e n e r NazovGramatiky. g4

Traverzovanie syntaktického stromu: Visitor Uvedeným volaním sú okrem iného vytvorené:

Traverzovanie syntaktického stromu: Visitor Uvedeným volaním sú okrem iného vytvorené: Rozhranie GramatikaVisitor<T> dediace od ParseTreeVisitor<T>

Traverzovanie syntaktického stromu: Visitor Uvedeným volaním sú okrem iného vytvorené: Rozhranie GramatikaVisitor<T> dediace od ParseTreeVisitor<T> Trieda GramatikaBaseVisitor<T> dediaca od AbstractParseTreeVisitor<T> a implementujúca GramatikaVisitor<T>

Traverzovanie syntaktického stromu: Visitor Uvedeným volaním sú okrem iného vytvorené: Rozhranie GramatikaVisitor<T> dediace od ParseTreeVisitor<T> Trieda GramatikaBaseVisitor<T> dediaca od AbstractParseTreeVisitor<T> a implementujúca GramatikaVisitor<T> GramatikaBaseVisitor<T> obsahuje východzie implementácie metód na návštevu koreňa podstromu (navštív všetky deti)

Traverzovanie syntaktického stromu: Visitor Uvedeným volaním sú okrem iného vytvorené: Rozhranie GramatikaVisitor<T> dediace od ParseTreeVisitor<T> Trieda GramatikaBaseVisitor<T> dediaca od AbstractParseTreeVisitor<T> a implementujúca GramatikaVisitor<T> GramatikaBaseVisitor<T> obsahuje východzie implementácie metód na návštevu koreňa podstromu (navštív všetky deti) Od GramatikaBaseVisitor<T> môže dediť trieda obsahujúca ozajstné implementácie týchto metód

Traverzovanie syntaktického stromu: Visitor Uvedeným volaním sú okrem iného vytvorené: Rozhranie GramatikaVisitor<T> dediace od ParseTreeVisitor<T> Trieda GramatikaBaseVisitor<T> dediaca od AbstractParseTreeVisitor<T> a implementujúca GramatikaVisitor<T> GramatikaBaseVisitor<T> obsahuje východzie implementácie metód na návštevu koreňa podstromu (navštív všetky deti) Od GramatikaBaseVisitor<T> môže dediť trieda obsahujúca ozajstné implementácie týchto metód T je trieda, ktorej inštancie sú výstupmi metód na návštevu podstromov

Traverzovanie syntaktického stromu: Visitor Uvedeným volaním sú okrem iného vytvorené: Rozhranie GramatikaVisitor<T> dediace od ParseTreeVisitor<T> Trieda GramatikaBaseVisitor<T> dediaca od AbstractParseTreeVisitor<T> a implementujúca GramatikaVisitor<T> GramatikaBaseVisitor<T> obsahuje východzie implementácie metód na návštevu koreňa podstromu (navštív všetky deti) Od GramatikaBaseVisitor<T> môže dediť trieda obsahujúca ozajstné implementácie týchto metód T je trieda, ktorej inštancie sú výstupmi metód na návštevu podstromov Od AbstractParseTreeVisitor<T> je zdedená metóda T visit(parsetree tree)

Traverzovanie syntaktického stromu: Visitor Uvedeným volaním sú okrem iného vytvorené: Rozhranie GramatikaVisitor<T> dediace od ParseTreeVisitor<T> Trieda GramatikaBaseVisitor<T> dediaca od AbstractParseTreeVisitor<T> a implementujúca GramatikaVisitor<T> GramatikaBaseVisitor<T> obsahuje východzie implementácie metód na návštevu koreňa podstromu (navštív všetky deti) Od GramatikaBaseVisitor<T> môže dediť trieda obsahujúca ozajstné implementácie týchto metód T je trieda, ktorej inštancie sú výstupmi metód na návštevu podstromov Od AbstractParseTreeVisitor<T> je zdedená metóda T visit(parsetree tree) Táto metóda sa používa v implementáciách jednotlivých metód vistora ( kontexty dedia od ParseTree), ako aj v hlavnom programe na spustenie traverzovania

Ľavá a pravá asociatívnosť operátorov Automaticky identifikované operátory chápe ANTLR4 ako ľavo asociatívne

Ľavá a pravá asociatívnosť operátorov Automaticky identifikované operátory chápe ANTLR4 ako ľavo asociatívne Väčšinou je to v poriadku: napríklad a b c = (a b) c

Ľavá a pravá asociatívnosť operátorov Automaticky identifikované operátory chápe ANTLR4 ako ľavo asociatívne Väčšinou je to v poriadku: napríklad a b c = (a b) c Niektoré operátory sú pravo asociatívne: a^b^c = a^(b^c)

Ľavá a pravá asociatívnosť operátorov Automaticky identifikované operátory chápe ANTLR4 ako ľavo asociatívne Väčšinou je to v poriadku: napríklad a b c = (a b) c Niektoré operátory sú pravo asociatívne: a^b^c = a^(b^c) ANTLR4 umožňuje špecifikovať asociativitu binárneho operátora na začiatku alternatívy:

Ľavá a pravá asociatívnosť operátorov Automaticky identifikované operátory chápe ANTLR4 ako ľavo asociatívne Väčšinou je to v poriadku: napríklad a b c = (a b) c Niektoré operátory sú pravo asociatívne: a^b^c = a^(b^c) ANTLR4 umožňuje špecifikovať asociativitu binárneho operátora na začiatku alternatívy: 1 expr : <assoc=right > expr op=pow expr # BinOp 3 expr op =( MUL DIV ) expr # BinOp expr op =( ADD SUB ) expr # BinOp 5 LEFT expr RIGHT # Paren SUB LEFT expr RIGHT # NegParen 7 NUM # Number SUB NUM # NegNumber 9 ;