UPE - referenční popis jazyka


Štěpán Roh

Verze 0.1
Revize dokumentu 1.0 (20.8.2000)

Formát zdrojového souboru

Zdrojový soubor se skládá z následujících částí:

Tyto části mohou být libovolně promíchány (i vnitřně mezi sebou), i když je doporučeno mít globální definice přede všemi ostatními. Vyhodnocení symbolů se provádí až po načtení celého zdrojové souboru, takže je možno se odkazovat na ještě nedeklarované symboly. K těmto částím je ještě třeba připočíst direktivy zpracovávané lexikálním analyzátorem, které mohou figurovat kdekoliv.

Direktivy

Jedinou skutečnou direktivou je include, za kterou následuje jméno souboru v uvozovkách :

        include "soubor nebo cesta"

Tato direktiva bezprostředně vloží obsah souboru (který se hledá v aktuálním adresáři) do aktuálního souboru beze změny stavu parseru.

Dalšími direktivami jsou komentáře a to ve třech formách :

        # cokoliv do konce řádku
        // cokoliv do konce řádku
        /* cokoliv i přes více
         řádek */

Globální definice

Globální definice jsou důležité pro popis procesoru jako celku. Jsou to tyto :

byte_size <počet bitů>
Velikost bytu v bitech (1 až 32 bitů). Implicitně 8 bitů.
numbers_len <délka číselných konstant v bitech>
Velikost konstant uvedených jako číslo ve ydrojových textech v bitech. Implicitně 32 bitů.
byte_order <způsob ukládání bytů>,...
Způsob ukládání bytů do emulované paměti. Při ukládání nějakého množství bytů se na základě dělky v bytech vezme příslušná položka z byte_order a byty se zapíší v daném pořadí. Pořadí se skládá z číslic 19, kde 1 značí první byte a 9 osmý. Není-li pro daný rozsah uvedeno řazení, tak se bere jako 1234... atd.
constant <jméno konstanty> <hodnota>:<délka v bitech>
Definice konstanty o dané hodnotě a délce v bitech. Konstantu je možno použít všude tam, kde je vyžadován nějaký číselný výraz.

Definice registrů

Registry jsou speciální proměnné reprezentující registry procesoru (ale nejenom ty) :

register <jméno registru>:<délka v bitech> (ip)
Definice nového registru. Je-li přítomno ip, tak je daný registr označen jako "programový čítač" ve kterém je obsažena adresa další instrukce. Tento registr není modifikován implicitně, ale je třeba jej po každé dekódované instrukci posunout.

Definice funkcí

function <jméno funkce> ((argumenty)) { <tělo funkce> }
Definice (a deklarace) funkce. Argumenty jsou jména oddělená čárkou. Argumenty se předávají odkazem, takže jejich změna se promítne k volajícímu. Tělo funkce viz níže. Před tělem funkce ještě mohou být deklarace proměnných :
var <jméno proměnné>:<délka v bitech>,...
external function <jméno funkce> ((argumenty));
Deklarace externí funkce. Externí funkce jsou specifikovány mimo zdrojový kód procesoru (viz dokument "Spolupráce s jazykem C").

Definice instrukcí

Instrukční blok obsahuje samotné jádro emulovaného procesoru. Při každém kroku procesoru se postupně prověří všechny bloky instructions a jejich větve a pro všechny větve které se shodují je vykonán jejich kód.

instructions <instrukční maska> { <výraz> { <kód> } ... }
Pakliže je splněna instrukční maska, tak se vykonají jednotlivé větve za podmínky, že jejich výraz je nenulový. Instrukční maska je tvaru :
<bitový rozsah>:<hodnota> (as <alias jméno>)
Bitový rozsah je ve tvaru <počáteční bit>- <koncový bit> nebo <koncový bit s počátečním na nule>. Hodnota může být buď číslo, pak se daný blok prověřuje jenom když je daný načtený bitový úsek stejné hodnoty nebo to může být otazník, pak se pouze přiřadí daný bitový úsek do proměnné s daným jménem.

Výkonný kód

Kód se skládá z příkazů. Každý příkaz musí končit středníkem. Jednotlivé příkazy jsou :

<výraz>
Viz níže.
break
Vyskočí z nejvnitřnějšího cyklu.
continue
Iniciuje další krok cyklu.
while (<výraz>) { <kód> }
Kód se provádí, dokud je výraz nenulový.
for (<inicializátor>, <podmínka>, <iterátor>) { <kód> }
Nejdříve provede inicalizátor, a poté provádí kód a iterátor tak dlouho, než je podmínka nulová.
do { <kód> } while (<výraz>)
while cyklus s testem podmínky na konci.
if (<výraz>) { <kód> } (else { <else-kód> } )
Je-li výraz nenulový provede se kód, je-li nulový a je přítomna else větev, tak se provede else-kód.
return <výraz>
Návrat z funkce s danou návratovou hodnotou.

Výrazy

Možné výrazy

<číslo>
Dané číslo, které bude mít poté bitvou délku zadanou pomocí globální definice numbers_len.
<proměnná, registr nebo alias>++
Postinkrement.
<proměnná, registr nebo alias>--
Postdekrement.
++<proměnná, registr nebo alias>
Preinkrement.
--<proměnná, registr nebo alias>
Predekrement.
<výraz> + <výraz>
Sčítání.
<výraz> - <výraz>
Odčítání.
<výraz> << <výraz>
Bitový posun doleva.
<výraz> >> <výraz>
Bitový posun doprava.
!<výraz>
Logická negace.
<výraz> && <výraz>
Logický and.
<výraz> | <výraz>
Logické or.
<výraz>
Bitová negace.
<výraz> & <výraz>
Bitový and.
<výraz> | <výraz>
Bitové or.
<výraz> ^ <výraz>
Bitové xor.
(<výraz>)
Závorky.
<jméno proměnné, registru, konstanty nebo alias>
Daná hodnota.
<jméno funkce> ((<argumenty>,...))
Volání funkce.
<výraz> == <výraz>
1, když jsou si oba výrazy rovny, 0 jinak.
<výraz> != <výraz>
1, když si nejsou oba výrazy rovny, 0 jinak.
<výraz> < <výraz>
1, když je první výraz menší než druhý, 0 jinak.
<výraz> <= <výraz>
1, když je první výraz menší nebo roven než druhý, 0 jinak.
<výraz> > <výraz>
1, když je první výraz větší než druhý, 0 jinak.
<výraz> >= <výraz>
1, když je první výraz větší nebo roven než druhý, 0 jinak.
<výraz> ? <výraz> : <výraz>
Má hodnotu druhého výrazu, když je první výraz nenulový, jinak má hodnotu třetího výrazu.
<výraz>:(<bitový rozsah>
Z hodnoty daného výrazu vyřízne pouze daný bitový rozsah.
<proměnná, registr nebo alias> = <výraz>
Přiřazení, má hodnotu výsledku.
<proměnná, registr nebo alias> += <výraz>
Přičtení, má hodnotu výsledku.
<proměnná, registr nebo alias> -= <výraz>
Odečtení, má hodnotu výsledku.
<proměnná, registr nebo alias> &= <výraz>
Bitový and, má hodnotu výsledku.
<proměnná, registr nebo alias> |= <výraz>
Bitové or, má hodnotu výsledku.
<proměnná, registr nebo alias> ^= <výraz>
Bitové xor, má hodnotu výsledku.
<proměnná, registr nebo alias> <<= <výraz>
Bitový posun doleva, má hodnotu výsledku.
<proměnná, registr nebo alias> >>= <výraz>
Bitový posun doprava, má hodnotu výsledku.

Priorita operátorů

v následující tabulce je priorita operátorů od nejvyšší k nejnižší.

Priorita operátorů
Operátory Asociativita
() zleva
! ~ ++ -- zprava
+ - zleva
<< >> zleva
< <= > >= zleva
== != zleva
& zleva
^ zleva
| zleva
&& zleva
| zleva
?: zprava
= a spol. zprava

Vestavěné funkce

Všechny tyto funkce se volají stejně jako uživatelsky definované funkce.

overflow ()
Vrací 1, přesáhlo-li poslední sčítání maximální hodnotu danou bitovou délkou operandů.
underflow ()
Vrací 1, zasáhlo-li poslední odčítání do záporných čísel.
bit_length (<argument>)
Vrací bitovou délku argumentu.
fetch (<paměťový pool>, <adresa>, <počet bytů>)
Vrací číslo o daném počtu bytů načtených z daného poolu a adresy. Hodnota je přečtena s použitím byte_order.
store (<paměťový pool>, <adresa>, <hodnota>)
Uloží hodnotu do paměti.
mem_violation ()
Vrací 1, bylo-li poslední čtení/zápis do paměti mimo paměť, popř. z/do zakázané oblasti.


This document was generated using AFT v5.05b