01. Celočíselná kalkulačka pomocou Lex a Yacc
Úlohy:
Úloha:
Stiahnite si zdrojové texty projektu jednoduchého celočíselného kalkulátora a rozbaľte ho. Spustite NetBeans a otvorte projekt.
Úloha:
Skomilujte projekt pomocou tlačidla
a následne spustite kalkulátor stlačením tlačidla
v paneli nástrojov. Vyskúšajte zadať jednoduché aritmetické výrazy. Aké výrazy dokáže kalkulačka spracovať a aké nie?


- umocňovanie:
x^
má významx*x
- faktoriál:
x!
má význam1*2* ... * x
(x>0) - posun doľava:
x<<y
má význam posunu x o y-bitov doľava - posun doprava:
x>>y
má význam posunu x o y-bitov doprava
Úloha:
Upravte
calc1.l
a calc1.y
tak, aby kalkulačka umožňovala:
02. Reálnočíselná kalkulačka
Úlohy:
Úloha:
Preštudujte si implementáciu reálnočíselnej kalkulačky. Ako sa v akciách vo vstupnom súbore pre Yacc pristupuje k prenášaným
hodnotám? Používa sa identifikátor typu (napríklad
$1.ihod
)?
int(vyraz)
, kde výsledkom bude celočíselná hodnota výrazux@y
, kde výsledkom bude y-ta (y — celé číslo) mocnina x (celé alebo reálne číslo)- Relačné operátory
<
,<=
,>
,>=
,==
,!=
, kde výsledkom bude 0 alebo 1 x ? y : z
, kde výsledkom bude y, ak hodnota x bude nenulová a výsledkom bude z, ak hodnota x bude nulová
Úloha:
Upravte calc2.l a calc2.y, aby kalkulačka umožňovala:
03. Syntaktická analýza jazyka JMM
Úlohy:
Úloha:
Experimentujte s dodaným
analyzátorom. Použite pri tom vzorový vstupný súbor
"vstup0.jmm". Aké konštrukcie jazyka JMM dokáže analyzátor akceptovať a aké
nie?
Úloha:
Preštudujte si kód analyzátora a doplňte rozpoznávanie príkazov
for a switch. Pre testovanie použite súbor
"vstup1.jmm".
Úloha:
Ošetrite možnosť použitia viacerých príkazov v case
vetvách a tiež použitie príkazu break. Zabezpečte, aby
sa príkazy case a default nemohli používať
mimo príkazu switch.
04. Spracovanie deklarácie triedy JMM
Úlohy:
Úloha:
V zdrojových kódoch
prekladača sa oboznámte sa so štruktúrami pre uchovanie
informácii o triedach, s funkciami pre prácu s nimi a s ich použitím v
prekladači.
- pre zdedené dátové členy:
.inheritedfield <modifikátory-prístupu> <meno> <signatúra-typu>
- pre zdedené metódy:
.inheritedmethod <modifikátory-prístupu> <meno> <signatúra-metódy>
Úloha:
Doplňte výstup zdedených dátových členov a metód (do funkcie
vypisTriedy
) v tvare:
Poznámka:
Takéto klauzuly nie sú platnými v jazyku Jasmin a ich výpis slúži len na
ukážku práce s údajovými štruktúrami obsahujúcimi informácie o
triedach.
Príklad:
Doplňte do prekladača podporu pre implementáciu rozhraní. Zabezpečte,
aby pri použití klauzuly
implements
v definícii triedy,
bola pre každé implementované rozhranie vygenerovaná do výstupného JAL
súboru direktíva v tvare:
.implements <meno-rozhrania>
Poznámka:
Pre uchovanie informácií o implementovaných rozhraniach potrebujete
pridať novú položku do tabuľky tried a doplniť akcie k pravidlu
ImpRozhrania, ktorá tieto uchová index implementovaného
rozhrania v tabuľke tried.
05. Preklad primárnych výrazov
Úlohy:
Úloha:
Oboznámte sa s potrebnými
inštrukciami JVM
Úloha:
Oboznámte sa s vytvoreným
prekladačom. Vyskúšajte prekladač na jednoduchom
príklade (
prim.jmm
, prim.htm
).
Úloha:
Doplňte implementáciu konverzie hodnôt pomocou výrazu v tvare
INT LOZAT Vyraz POZAT
(v prim.jmm
odstráňte symboly komentára).
DOUBLE LOZAT Vyraz POZAT {$$.sig=...; $$.kod=...;}
LONG LOZAT Vyraz POZAT {$$.sig=...; $$.kod=...;}
Úloha:
Doplňte rozpoznanie celočíselnej konštanty v 16-kovej sústave, napr.
Ox10
, 0xBABA
, 0xda7a
06. Preklad lokálnych premenných a volania metód JMM
Úlohy:
Úloha:
Oboznámte sa s implementáciou prekladu lokálnych premenných v prekladači.
Úloha:
Oboznámte sa s implementáciou týchto funkcií v zdrojovom kóde
prekladača.
Úloha:
Oboznámte sa s implementáciou prekladu volania metód v kóde
prekladača. Dôležité je prejsť si spracovanie symbolov
MetVolanie
, NepArgumenty
a
Argumenty
. Vyskúšajte prekladač na jednoduchom
príklade (ahoj.jmm
)
Úloha:
Doplňte operátory inkrementácie a dekrementácie pre lokálne
premenné (k neterminálnemu symbolu
Primarny
) v tvare:
ID ++
++ ID
ID --
-- ID
ID += Vyraz
ID -= Vyraz
Otestujte funkčnosť doplneného prekladača na príkladoch postupným
odstraňovaním znakov komentára v súbore ahoj.jmm
07. Preklad dátových členov JMM
Úlohy:
Úloha:
Oboznámte sa s vytvoreným
prekladačom. Vyskúšajte prekladač na jednoduchom
príklade (
ahoj.jmm
)
Úloha:
Doplňte implementáciu operátorov inkrementácie (
INC
) a
dekrementácie (DEC
) pre inštančné členské premenné
(this.meno
):
DCPrirad : ...
| Vyraz BODKA ID INC
| INC Vyraz BODKA ID
| Vyraz BODKA ID DEC
| DEC Vyraz BODKA ID
08. Preklad výrazov s operátormi JMM
Úlohy:
Úloha:
Oboznámte sa s vytvoreným
prekladačom. Vyskúšajte prekladač na jednoduchom
príklade (
ahoj.jmm
)
%
– (zvyšok po delení [kódZVYS
]),!
– (negácia [kódNOT
])? :
– (podmienkový výraz [kódyOTAZ
DBOD
])
Úloha:
Doplňte implementáciu operátorov:
Vyraz
.
Vyraz : ...
| Vyraz ZVYS Vyraz
| NOT Vyraz
| Vyraz OTAZ Vyraz DBOD Vyraz
Pre implementáciu operácie %
možno využiť funkciu
binAritVyraz()
. Pre implementáciu sú potrebné JVM
inštrukcie irem
, drem
, ixor
,
goto
, ifeq
.
09. Preklad príkazov
Úlohy:
Úloha:
Oboznámte sa s vytvoreným
prekladačom. Vyskúšajte prekladač na jednoduchých
príkladoch (
acyklus.jmm
, grtest.jmm
)
Úloha:
Doplňte príkaz cyklu FOR so syntaxou (
acyklus.jmm
):
Prikaz -> for ( VoidVyraz ; Vyraz ; VoidVyraz ) Prikaz
@MenoTriedy