Specifikace jazyka
Formát programu
Program je tvořen posloupností příkazů. Příkazy jsou zapsány ve volném formátu, poznámky, mezery, tabulátory a konce řádků slouží pouze jako oddělovače a na význam programu nemají vliv. Poznámky jsou omezeny dvěma lomítky a koncem řádku. Klíčová slova jsou rezervovaná. V identifikátorech a klíčových slovech se rozlišují velká a malá písmena.
Proměnné
Názvy proměnných jsou tvořeny identifikátorem. Každá proměnná musí být před
použitím deklarována, opakovaná deklarace proměnné téhož názvu je chybou. Po
deklaraci má proměnná podle svého typu hodnotu 0, 0.0,
"", resp. False.
Příkazy
Jsou definovány následující příkazy:
- Prázdný příkaz
; - typ proměnná, proměnná, ...;
Deklarace proměnných uvedeného typu. Typem může býtint,float,booleanneboString. - proměnná
=výraz;
Přiřazení hodnoty výrazu proměnné. Proměnná na levé straně musí být deklarovaná. Typ výrazu na pravé straně musí být kompatibilní vzhledem k přiřazení s typem proměnné, tj. typy musí být stejné nebo je možné přiřazovat celočíselné hodnoty do reálných proměnných s provedením automatické konverze. readproměnná, proměnná, ...;
Přečtení hodnoty ze standardního vstupu a přiřazení do proměnných. Každá čtená hodnota je na samostatném vstupním řádku.printvýraz, výraz, ...;
Výpis hodnoty výrazů na standardní výstup. Za hodnotou posledního výrazu je vypsán znak konce řádku.ifpodmínkathenpříkazyelsepříkazyend;
Podmíněný příkaz, podmínka musí být booleovský výraz. Příkazy označují posloupnost příkazů oddělených středníkem. Část else je nepovinná. I v tomto případě příkaz musí končit klíčovým slovem end.whilepodmínkadopříkazyend;
Příkaz cyklu, podmínka musí být booleovský výraz. Příkazy označují posloupnost příkazů oddělených středníkem.
Výrazy
V argumentech výrazů se jako operandy mohou vyskytovat celá desítková čísla, reálná čísla (včetně případného exponentu) a řetězce v uvozovkách (bez escape sekvencí). Operandy musí být typově kompatibilní, podle potřeby se provádí automatická konverze celočíselných operandů na reálné (ne naopak).
Jsou definovány následující operátory (písmena I, R, B, S vyjadřují datové typy int, float, boolean a String, typy T v relačních operátorech a ternárním operátoru ?: musí být v rámci jednoho operátoru kompatibilní). ):
| Popis | Operátor | Signatura |
|---|---|---|
| unární operátor pro změnu znaménka | - |
I->I, R->R |
| binární aritmetické operátory | + - * / |
IxI->I, RxR->R |
% |
IxI->I | |
| operátor konkatenace | . |
SxS->S |
| relační operátory | < <= > >= == != |
TxT->B (T = I,R,S,B) |
| logické operátory | &&, || |
BxB->B |
! |
B->B | |
| ternární operátor | podmínka ? výraz : výraz |
BxTxT->T (T = I,R,S,B) |
Výrazy mohou obsahovat závorky. Operátory jsou zleva asociativní, priorita operátorů je následující (v pořadí od nejnižší k nejvyšší):
- ||
- &&
- relační operátory
- + - .
- * / %
- !, unární -
Ve výrazech se dále mohou vyskytovat konstanty True a
False typu boolean (pro relační operátory platí False < True).
Varianty zadání
Kombinovaní studenti
Řešení nemusí obsahovat příkazy if a while.
Konstrukce jazyka demonstruje následující ukázkové vstupy: t1.txt, t1e1.txt, t2.txt, t3.txt.
Syntaktický analyzátor jazyka: Project.jj
Vnitřní reprezentace a pomocné třídy: Zdrojové kódy
Kompletní zdrojové kódy spojující IR a syntaktický analyzátor: Zdrojové kódy
15.4. Opraveno - '.' lze použít jako operátor (byla brána jako začátek desetinného čísla), při implementaci Visitoru nebyla procházená pravá větev BinaryExpression.
Dohodnuté instrukce:
| Instrukce | Doplňující informace |
|---|---|
| add | sčítání |
| sub | odečítání |
| mul | násobení |
| div | dělení |
| mod | modulo |
| uminus | unární mínus |
| concat | spojení řetězců |
| and | |
| or | |
| gt | > |
| lt | < |
| eq | = |
| not | negace |
| push x | Uloží na zásobník hodnotu x, z praktického hlediska je jednodušší, pokud je hodnota rozšířena o typ. Typ může reprezentovat například velké písmeno na začátku. Konkretní příklady tak mohou být: push I0 (int 0), push Btrue, push I123, push sabc (řetězec abc),push S(prázdný řetezec) |
| load id | Načte hodnotu proměnné id na zásobník. |
| save id | Uloží hodnotu ze zásobníku do proměnné. |
| label n | |
| jmp n | Skok na návěští. |
| fjmp n | Podmíněný skok na návěští. Skok se provede jen v případě, že na zásobníku je hodnota false; |
| print n | Tisk n hodnot na obrazovku. |
| read X | Přečte hodnotu typu X ze vstupu. Typ X může být zadán například: I - int, S - String, B - boolean, F - double/float |
| (c) Marek Běhálek, FEI VŠB-TU Ostrava | Desing: Miroslav Beneš, FEI VŠB-TU Ostrava | 8. 2. 2012 17:40:33 |