DevLab

Mini Forth İnterpretatoru

Çətin
stackparsinginterpretererror-handling
3000 ms
256 MB

Forth, məlumatların idarə edilməsi üçün LIFO (Stack) məntiqinə əsaslanan proqramlaşdırma dilidir. Sizin vəzifəniz Forth dilinin sadələşdirilmiş bir versiyası üçün interpretator yazmaqdır.

Yazacağınız interpretator aşağıdakı əməliyyatları dəstəkləməlidir:

  1. Riyazi əməliyyatlar: + (toplama), - (çıxma), * (vurma), / (tam ədədli bölmə).

  2. Yığın (Stack) Manipulyasiyaları

    Operation

    Effect

    Example

    DUP

    Yığının ən üstündəki elementi kopyalayır.

    5 8 DUP → 5 8 8

    DROP

    Yığının ən üstündəki elementi silir.

    5 8 DROP → 5

    SWAP

    Yığının ən üstündəki iki elementin yerini dəyişdirir.

    5 8 SWAP → 8 5

    OVER

    Yığının üstündən ikinci elementi kopyalayır və ən üstə əlavə edir.

    5 8 OVER → 5 8 5

  3. Yeni Sözlərin (Funksiyaların) Yaradılması İstifadəçi : (iki nöqtə) və ; (nöqtəli vergül) simvollarından istifadə edərək bir neçə əməliyyatı tək bir "söz" altında birləşdirə bilər.

    • Sintaksis: : yeni-soz emeliyyatlar ;

    • Nümunə: : kvadrat DUP * ; komandası kvadrat adlı yeni əməliyyat yaradır. Bundan sonra proqramda 5 kvadrat yazıldıqda, interpretator bunu 5 DUP * kimi başa düşəcək və yığına 25 əlavə edəcək.

    • Qeyd: Yeni yaradılan sözlər əvvəlcədən mövcud olan sözlərin (hətta + və ya DUP kimi standart komandaların da) üzərinə yazıla bilər, lakin rəqəmləri yenidən təyin etmək qadağandır.

Vacib Qaydalar və Xətalar (Error Handling): Proqramınız icra zamanı hər hansı xəta ilə qarşılaşarsa, dərhal dayanmalı və yalnızca müvafiq xəta mesajını çap etməlidir:

  • Əgər yığına ən azı 1 element lazım olan əməliyyat çağırılıbsa və yığın boşdursa: empty stack

  • Əgər yığına ən azı 2 element lazım olan əməliyyat (+, -, *, /, SWAP, OVER) çağırılıbsa, lakin yığında yalnız 1 element varsa: only one value on the stack

  • Sıfıra bölmə cəhdi olarsa: divide by zero

  • Mövcud olmayan (tanınmayan) bir söz icra edilməyə çalışılarsa: undefined operation

  • İstifadəçi rəqəmləri (məsələn, 1, 2, -5) yeni söz kimi təyin etməyə çalışarsa (məsələn, : 1 2 ;): illegal operation

  • Dil böyük/kiçik hərflərə həssas deyil (Case-insensitive).

Giriş verilənləri:

Birinci sətirdə komandaların sətir sayını bildirən N tam ədədi verilir. Növbəti N sətirdə Forth komandaları verilir.

Çıxış verilənləri:

Bütün komandalar uğurla icra edilərsə, yığının (stack) yekun vəziyyətini aşağıdan yuxarıya doğru aralarında bir boşluq olmaqla çap edin. Xəta olarsa, yalnız xəta mesajını çap edin.

1Nümunə 1:
Giriş:
1 1 2 3 +
Çıxış:
1 5
2Nümunə 2:
Giriş:
1 1 3 4 * +
Çıxış:
13
REDAKTOR
Giriş edin
Giriş:
1 1 2 3 4 5
Çıxış:
1 2 3 4 5