Zadanie:
Musisz utworzyć interpreter, który będzie mógł analizować fragmenty języka programowania. Język nie musi być skomplikowany, ale musi zawierać następujące elementy składniowe:
- Możliwość przypisywania i odczytywania zmiennych (może być tak proste, jak
a
-z
predefiniowane zmienne) - Jeśli instrukcje (elseif i else nie są wymagane)
- Pętle (licząc do dowolnej liczby, dostęp użytkownika do licznika nie jest wymagany)
- Prosta matematyka ze zmiennymi (dodawanie, odejmowanie, mnożenie, dzielenie, większa / mniejsza niż, równa się)
- Wydrukuj wyciągi
Zasady:
- Nie możesz kopiować składni innego popularnego języka.
- Musisz napisać własnego tłumacza, a nie modyfikację innego tłumacza.
- Możesz napisać tłumacza w dowolnym języku.
- Napisz przykładowy program z 99 butelkami piwa w swoim języku (patrz tutaj )
- To konkurs popularności , więc wygrywa najbardziej pozytywna odpowiedź.
Odpowiedzi:
DogeScript
Program 99 butelek piwa:
Tłumacz PHP:
Obecna składnia:
Wypróbuj tutaj .
Wszelkie sugestie dotyczące ulepszeń są mile widziane.
źródło
BrainBack: skompilowany język oparty na stosie działający na BrainFuck
NB: Specyfikacja została zmieniona z „tworzenie parsera” na „tworzenie interpretera” po opublikowaniu tej odpowiedzi. Ta odpowiedź to kompilator, który również analizuje kod źródłowy.
Nazwa to kalambur na powrót będąc przeciwieństwem znanego języka opartego na stos i mózgu wskazuje, że to ezoteryczny charakter. Wygląda trochę jak BrainFuck (choć nie jest), ale jego kompilator działa na BrainFuck, a skompilowany kod obiektowy kończy się jako pliki binarne BrainFuck.
Język: * == niszczy argumenty
"constant"
drukuje stałe#
drukuje górę stosu jako liczbę>
duplikuje górę stosu<num>
push stałą liczbę<num>
jako wartość na górę stosu<
usuń górę stosu-
odejmij najwyższą z drugiej najwyższej *+
dodaj najwyższą pozycję do drugiej najwyższej pozycji *!
nie przełącza dodatniego / zerowego *[ ... ]
robi chwilę na szczycie stosu, a nie zero, bardzo podobny do BrainFuck99 butelek piwa z poprawnymi tekstami w BrainBack:
Kompilator BrainBack napisany w Extended BrainFuck
Aby skompilować BrainBack:
Aby skompilować program BrainBack:
Uruchom plik binarny:
Tutaj używam bf, który jest dostępny w większości dystrybucji Debiana.
beef
i inne mogą być również używane. Zarówno kompilator EBF, BrainBack, jak i jego kod obiektowy stają się całkiem kompatybilnymi plikami binarnymi BrainFuck.Prawdopodobnie należy go rozszerzyć, aby wydrukować komórkę jako ascii
.
, być w stanie odczytać bajt,
i mieć różneswap
operacje, aby być bardziej użytecznym. Jest to absolutnie potrzebne do stworzenia kompilatora lub interpretera BrainBack w BrainBack.źródło
€
Większość czasu spędzam na skryptach PHP, co przyniosło mi pytanie: dlaczego muszę używać
$
nazw zmiennych?€
to moja lokalna waluta, więc użyjmy jej! Ponieważ € jest używane w wielu krajach, użyłem słów kluczowych z języków UE.Słowa kluczowe:
gleich
jest równy w języku niemieckimmientras
jest natomiast w języku hiszpańskimtopo
jest większy w języku portugalskim (aktualizacja: zamiast tego powinno być maior , dzięki daHugLenny za wskazówkę)odejmowanie
jest odejmowanie w języku polskimafficher
jest drukowany w języku francuskimnl
czasami wywoływane , a TLDNETHERLANDS
jestnl
, więc zdefiniowałem stałąNETHERLANDS
do wyświetlania nowych liniiOszukałem trochę, ponieważ nie ma
if
słowa kluczowego, zdecydowałem się bezpośrednio wydrukować ostatnie dwa wiersze.Tłumacz w Pythonie
Tłumacz wykona tylko skrypt, aby wyświetlić 99 butelek piwa.
Aby go uruchomić, zapisz oba pliki, a następnie uruchom plik Python ze
.eu
skryptem jako argumentem:źródło
topo
jest najlepszy w języku portugalskim1Lang
1Lang jest funkcjonalnym językiem przedrostka, takim jak LISP lub Scheme, ale bez nawiasów, co utrudnia czytanie, gdy wszystkie niepotrzebne białe znaki są usuwane. Nawiasy można usunąć, ponieważ wszystkie funkcje i operatory przyjmują znaną liczbę parametrów.
Nawiasy klamrowe są wymagane do rozgraniczenia treści funkcji i warunkowych konsekwencji oraz alternatywnych bloków kodu, które mogą składać się z listy instrukcji.
W LISP, czynnikowe można zdefiniować następująco:
w 1 języku to byłoby
który można zredukować do
1Lang obecnie nie obsługuje żadnych skutków ubocznych.
1Lang jest napisany bash, więc obecnie ma pewne ograniczenia bash, takie jak zakres liczb całkowitych.
Uwaga: Listy nie są w pełni zaimplementowane.
Liczby całkowite są liczbami całkowitymi typu bash (do -2 ^ 32 do 2 ^ 31-1). Liczb ujemnych nie można użyć bezpośrednio. Aby wprowadzić wartość ujemną, odejmij ją od zera. na przykład. -5 byłoby wprowadzane jako -0 5. To ograniczenie jest spowodowane tym, że 1Lang jest w toku i liczby ujemne nie były potrzebne dla tej aplikacji. Rozważam użycie ~ jako jednoznacznego operatora ujemnego, który pozwoliłby na wprowadzenie -5 jako ~ 5.
Do wyznaczenia liczb całkowitych wymagana jest biała spacja. na przykład. +2 3
Nazwy parametrów funkcji mogą przeciążać zmienne wywołujące. Wszystkie zmienne przypisane w ramach funkcji są lokalne.
Drukowanie nie jest konieczne (chociaż może być przydatne), ponieważ podobnie jak LISP każda instrukcja zwraca wartość, a drukowana jest ostatnia zwracana wartość.
Nieoczekiwane zachowanie notacji przedrostkowej bez nawiasów polega na tym, że konkatenacja ciągów znaków może być w rzeczywistości łatwa do napisania. Powiedzmy, że chcesz połączyć
"a" " quick" " brown" " fox"
, można napisać:Ale bardziej czytelną i mniej podatną na błędy metodą jest to:
lub
99 Butelek piwa kod:
Funkcja B zwraca „Brak więcej butelek” lub „1 butelka” lub „butelki” w zależności od x.
Funkcja F zwraca wiersze normalne lub końcowe. Normalny wiersz jest łączony z następnym wierszem przez rekurencyjne wywoływanie F z -x1. Gdy x wynosi 0, F zwraca ostatni wiersz.
To generuje (dla F5 oznacza początek od 5 butelek piwa ...):
1 Tłumacz języka (napisany bash) w mniej niż 500 liniach.
źródło
@Mfxy{fxy}M+3 4
działał, ale musisz dołączyć do funkcji i przestrzeni nazw zmiennych. Obliczenie 99 piw zajęło trochę czasu: pcons
mócmap
M\x{*x2}C1C2C3C4/ => (2 4 6 8)
Połowa (tłumacz / tłumacz w pakiecie Windows)
Nie wiem, dlaczego odpowiadam na tak wiele zagadek w pakiecie Windows, z jakiegoś chorego powodu, myślę, że mi się to podoba: P W każdym razie, jest to coś podobnego do czegoś, nad czym pracowałem jakiś czas temu, podstawowy język, który przetłumaczone na pakiet Windows za pomocą skryptu, który jest również zapisany w pakiecie Windows. Nie jest to szczególnie niesamowite, ale działa.
99 butelek piwa
Składnia
W każdej linii rozpoznawane są tylko trzy żetony, oddzielone spacjami.
# jest komentarzem.
W większości przypadków, gdy potrzebna jest wartość,
$
w drugim tokenie oznacza, że trzecią należy traktować jako nazwę zmiennej, podczas gdy a~
oznacza literalną wartość. Ogólne instrukcje mają formę<instruction> [$~] <name>
. Ustawienie zmiennej ma tę samą formę, ale jest implementowane, gdy nie zostanie rozpoznane.Zdefiniowane polecenia:
print
iwrite
oba zapisują dane wyjściowe, alewrite
nie dodają nowego wiersza. Potrzebuje $ lub ~.mark
tworzy punkt, który można przeskoczyć lub wywołać jako podprogram.jump
odpowiednik goto wsadowo (lub w dowolnym innym języku).proc
wywołuje podprogram. Odpowiednikcall :label
.return
zwraca z podprogramu. Wyjdzie z programu, gdy nie będzie w nim.if
instrukcja warunkowa. Pobiera porównanie z następnego wiersza, w formie<var1> <operator> <var2>
. Operatory są takie same jakif
wsadowe, tj.EQU, NEQ, LSS, LEQ, GTR, GEQ
. Wykona instrukcje po nim tylko wtedy, gdy porównanie jest prawdziwe.endif
kończy instrukcję if.cat
łączy dwie zmienne.cat a b
zapisze wartość ab w a.Gdy żadne z tych poleceń nie zostanie znalezione, wyrażenie jest traktowane jako przypisanie zmiennej, przy użyciu pierwszego tokena jako nazwy zmiennej.
$
i~
zachowuj się tak samo jak wprint
, ale jest też@
identyfikator. To traktuje ostatni token jako wyrażenie matematyczne, przekazane doset /a
. Obejmuje większość operatorów. Jeśli żaden z trzech identyfikatorów nie zostanie znaleziony, oznacza to błąd składniowy i interpreter zostanie zamknięty.Tłumacz (partia Windows)
Tłumacz interpretuje kod na pakiet Windows, umieszcza go w pliku tymczasowym i wykonuje. Chociaż rozpoznaje błędy składniowe w języku Half, wynikowy skrypt wsadowy może powodować problemy, szczególnie ze znakami specjalnymi, takimi jak nawiasy, pionowe paski itp.
źródło
Flex Bison
Przypisz zmienną, jeśli inaczej blok warunków i jakieś inne dodawanie, operacja odejmowania.
Plik leksykalny
lex.l
Plik analizatora składni
com.y
Skompilować
Biegać
kompilator in.txt ou.txt
Plik wejściowy
a = 3 + (4 * 7) -9; wydrukuj a; c = a + 45; wydrukuj c;
** To jest komentarz zapisz c;
** zapisz c w pliku wydruku c * (a + 32);
Plik wyjściowy 67
źródło
Interpretator
Aby uzyskać instrukcje dotyczące uruchamiania tego kodu, spójrz na moją inną odpowiedź: /codegolf//a/19935/13186
99 butelek piwa
Program
źródło
99ISC
99ISC korzysta z pamięci zorientowanej na liczby całkowite o dowolnym rozmiarze. Pamięć jest indeksowana przez nieujemną liczbę całkowitą. Wszystkie wartości w pamięci są inicjowane ich adresem. Na przykład. W czasie wykonywania adres 0 zawiera wartość 0, a adres 9 zawiera wartość 9.
99ISC ma dwie instrukcje. Pierwszy drukuje procedurę 99 butelek piwa na ścianie. Jego składnia to pojedynczy wiersz, jak poniżej. Wykonanie jest kontynuowane od następnego wiersza w programie.
Druga instrukcja jest instrukcją „odejmuj i rozgałęziaj, jeśli nie jest równa zero”. Jego składnia to pojedynczy wiersz, jak poniżej.
x
jest adresem liczby, która ma być operowana,y
jest adresem liczby odejmowanej iz
jest następnym wierszem do wykonania, jeśli wynik odejmowania nie jest równy zero. W przeciwnym razie wykonanie przechodzi do następnego wiersza.Obecność instrukcji „odejmij-i-rozgałęź-jeśli-nie-zero” powoduje, że 99ISC jest OISC (komputer z zestawem instrukcji) i dlatego Turing jest kompletny.
Oto program, który usuwa pierwsze 10 wartości z pamięci, a następnie drukuje procedurę 99 butelek piwa na ścianie.
A tu jest interpreter 99ISC w Pythonie.
źródło
Daję ci:
Interpreter małego zestawu instrukcji (SISI)
Składnia opiera się na języku BASIC i asemblerze. Posiada cztery oświadczenia:
set
,print
,jump
(bezwarunkowego goto) orazjumpif
(goto warunkowa). Każda instrukcja musi być poprzedzona numerem linii. Obsługiwane typy danych to liczby całkowite i ciągi.Sam interpreter można znaleźć w Pythonie 3 na Github (sisi.py). Program 99 butelek piwa jest również dostępny, ale odtworzę go tutaj:
źródło
Pogo
https://github.com/nrubin29/Pogo
źródło
i
i ustawiam ją na 99. Następnie, gdy i jest większe od 0, wypisujęi bottles of beer on the wall
i odejmuję jedną z nichi
. Jeśli problem polega na tym, że brakuje mi niektórych tekstów, mogę dodać więcej.