JFiMK MEGA PACK, szkola, jezyki formalne i metody kompilacji


Zadanie 2

Dana jest gramatyka operatorowa prowadząca do następujących tabel pierwszeństw operatorów:

ASK

        

BD

0x01 graphic

        

0x01 graphic

Wybrać drzewo będące wynikiem parsingu wyrażenia:

ASK

BD

0x01 graphic

pierwsze

drugie

0x01 graphic

pierwsze

drugie

0x01 graphic

pierwsze

pierwsze

0x01 graphic

drugie

pierwsze

Komentarz:

Wyższe pierwszeństwo operatora oznacza, że jego argumenty są silniej połączone; dlatego muszą być bliżej siebie w drzewie.

Punktacja: za każde prawidłowe zaznaczenie po 5 punktów. Sporo osób z BD zaznaczyło dokładnie odwrotnie niż należało (za 0 punktów) -- gdyby rzucali monetą, to wyniki byłyby lepsze. Nie mam pojęcia skąd się to wzięło i dlaczego tylko w BD.

Zadanie 3

Wpisać w wolne miejsce w programie zstępującego parsera rekursywnego procedurę odpowiadającą jedynemu nieterminalowi <wyrażenie> gramatyki

ASK

        

BD

<wyrażenie>   ::=   a   |   b <wyrażenie> ;

        

<wyrażenie>   ::=   a   |   ( <wyrażenie> )

0x01 graphic

_________________________________________________________________________

0x01 graphic

PROCEDURE wyrazenie;

BEGIN

IF leks[nr_leks]='a' THEN

nr_leks:=nr_leks+1

ELSE

IF leks[nr_leks]='b' THEN

BEGIN

nr_leks:=nr_leks+1; wyrazenie;

IF leks[nr_leks]=';'

THEN nr_leks:=nr_leks+1

ELSE blad('NIE MA SREDNIKA')

END

ELSE ok := false

END {wyrazenie};

PROCEDURE wyrazenie;

BEGIN

IF leks[nr_leks]='a' THEN

nr_leks:=nr_leks+1

ELSE

IF leks[nr_leks]='(' THEN

BEGIN

nr_leks:=nr_leks+1; wyrazenie;

IF leks[nr_leks]=')'

THEN nr_leks:=nr_leks+1

ELSE blad('NIE MA SREDNIKA')

END

ELSE ok := false

END {wyrazenie};

ASK

        

BD

        

Komentarz:

To miał być sam sprawdzacz składni, co wynika jasno z podanej postaci programu głównego oraz nagłówka procedury wyrazenie (procedura bezparametrowa). Należało pamiętać o przechodzeniu do następnego leksemu w odpowiednich miejscach.

Zadanie 4

ASK

        

BD

Na każdą zmienną całkowitą rezerwujemy po 4 bajty; zmiennej tablicowej

  

t :

array [11 . . 30, 6 . . 35] of

  

  record

  

    a : integer;

  

    b : integer

  

  end

przypisujemy obszar pamięci zaczynający się w bajcie nr 5 000. Wtedy

zmienna

pierwszy
bajt

ostatni
bajt

t[11, 6]

5000

5007

t[16, 16]

6280

6287

t[11, 6].a

5000

5003

t[16, 16].b

6284

6287

        

Na każdą zmienną rzeczywistą rezerwujemy po 8 bajtów; zmiennej tablicowej

  

a :

array [1 . . 20, 1 . . 30] of

  

  record

  

    x : real;

  

    y : real

  

  end

przypisujemy obszar pamięci zaczynający się w bajcie nr 10 000. Wtedy

zmienna

pierwszy
bajt

ostatni
bajt

a[1, 1]

10000

10015

a[7, 21]

13200

13215

a[1, 1].x

10000

10007

a[7, 21].y

13208

13215

Komentarz:

Jeśli tablica tab ma deklarację tab : array [n . . n', p . . p'] of T

i zaczyna się w bajcie pocz, to element tab[i, j] zaczyna się w bajcie pocz + ((i - n) * (p' - p + 1) + j - p) * sT

gdzie sT jest ilością bajtów przeznaczoną na element typu T. W tym przypadku T jest typem rekordowym i