Tugas:
Anda harus membuat juru bahasa yang dapat mengurai potongan bahasa pemrograman. Bahasa tidak perlu rumit, tetapi harus mencakup elemen sintaksis berikut:
- Kemampuan untuk menetapkan dan membaca variabel (bisa sesederhana
a
-z
menjadi variabel premade) - Jika pernyataan (elseif dan lainnya tidak diperlukan)
- Loops (menghitung ke nomor acak, akses pengguna ke konter tidak diperlukan)
- Matematika sederhana dengan variabel (penjumlahan, pengurangan, perkalian, pembagian, lebih besar / kurang dari, sama dengan)
- Pernyataan cetak
Aturan:
- Anda tidak boleh menyalin sintaks dari bahasa populer lainnya.
- Anda perlu menulis juru bahasa Anda sendiri, bukan modifikasi juru bahasa lain.
- Anda dapat menulis juru bahasa Anda dalam bahasa apa pun.
- Tulis program contoh 99 botol bir dalam bahasa Anda (lihat di sini )
- Ini adalah kontes popularitas , sehingga jawaban yang paling banyak menang menang.
Jawaban:
DogeScript
Program 99 botol bir:
Penerjemah PHP:
Sintaksis seperti saat ini adalah:
Coba di sini .
Setiap saran untuk perbaikan dipersilahkan.
sumber
BrainBack: Bahasa kompilasi berbasis stack yang berjalan di BrainFuck
NB: Spec diubah dari "create parser" menjadi "create interpreter" setelah saya memposting jawaban ini. Jawaban ini adalah kompiler yang juga mem-parsing kode sumber.
Nama adalah permainan kata-kata di Kembali sebagai kebalikan dari bahasa berbasis stack yang terkenal dan Brain yang menunjukkan sifat esoterisnya. Itu terlihat sedikit seperti BrainFuck (walaupun tidak), tetapi kompiler ini berjalan di BrainFuck dan kode objek yang dikompilasi berakhir sebagai binari BrainFuck.
Bahasa: * == menghancurkan argumennya
"constant"
mencetak konstan#
mencetak bagian atas tumpukan sebagai angka>
menduplikasi bagian atas tumpukan<num>
tekan angka konstan<num>
sebagai nilai ke atas tumpukan<
hapus bagian atas tumpukan-
kurangi paling atas dari paling atas kedua *+
tambahkan paling atas ke paling atas kedua *!
tidak beralih positif / nol *[ ... ]
tidak sementara top of stack tidak nol, sangat mirip dengan BrainFuck99 botol bir dengan lirik yang benar di BrainBack:
Kompiler BrainBack, ditulis dalam Extended BrainFuck
Untuk mengkompilasi BrainBack:
Untuk mengkompilasi program BrainBack:
Jalankan biner:
Di sini saya menggunakan bf yang tersedia di sebagian besar distro debian.
beef
dan yang lainnya juga bisa digunakan. Baik kompiler EBF, BrainBack dan kode objeknya menjadi biner BrainFuck yang cukup kompatibel.Mungkin perlu diperluas untuk mencetak sel sebagai ascii
.
, dapat membaca byte dalam,
dan memiliki berbagaiswap
operasi agar lebih bermanfaat. Ini mutlak diperlukan untuk membuat kompiler atau penerjemah BrainBack di BrainBack.sumber
€
Saya menghabiskan sebagian besar waktu saya di skrip PHP dan itu membawa saya pertanyaan: mengapa saya dipaksa untuk menggunakan
$
nama variabel saya?€
adalah mata uang lokal saya, jadi mari kita gunakan! Karena € digunakan di banyak negara, saya menggunakan beberapa kata dari bahasa UE sebagai kata kunci.Kata kunci:
gleich
adalah sama di Jermanmientras
adalah sementara di Spanyoltopo
adalah lebih besar di Portugis (update: harus maior sebaliknya, berkat daHugLenny untuk tip)odejmowanie
adalah kurangi di Polandiaafficher
adalah mencetak di Perancisnl
kadang - kadang disebut , dan TLDNETHERLANDS
adalahnl
, jadi saya mendefinisikan konstantaNETHERLANDS
untuk menampilkan baris baruSaya selingkuh sedikit karena tidak ada
if
kata kunci, saya memilih untuk langsung mencetak dua baris terakhir.Penerjemah dengan Python
Penerjemah tidak akan melakukan lebih dari mengeksekusi skrip untuk menampilkan 99 botol bir.
Untuk menjalankannya, simpan kedua file kemudian jalankan file Python dengan
.eu
skrip sebagai argumen:sumber
topo
adalah top dalam bahasa Portugis1Lang
1Lang adalah bahasa awalan fungsional seperti LISP atau Skema tetapi tanpa tanda kurung yang membuatnya sedikit lebih sulit untuk dibaca ketika semua ruang putih yang tidak perlu dihapus. Kurung dapat dihapus karena semua fungsi dan operator mengambil sejumlah parameter yang diketahui.
Kawat gigi diperlukan untuk membatasi fungsi tubuh dan konsekuensi bersyarat dan blok kode alternatif yang dapat terdiri dari daftar pernyataan.
Dalam LISP, faktorial dapat didefinisikan seperti ini:
di 1Lang ini akan menjadi
yang dapat dikurangi menjadi
1Lang saat ini tidak mendukung efek samping.
1Lang ditulis dalam bash sehingga saat ini berbagi beberapa batasan bash seperti rentang integer.
NB: Daftar tidak sepenuhnya diimplementasikan.
Integer adalah bash integer (hingga -2 ^ 32 hingga 2 ^ 31-1 saya pikir). Angka negatif tidak bisa langsung digunakan. Untuk memasukkan yang negatif, kurangi dari nol. misalnya. -5 akan dimasukkan sebagai -0 5. Batasan ini karena 1Lang adalah pekerjaan yang sedang berlangsung dan angka negatif tidak diperlukan untuk aplikasi ini. Saya sedang mempertimbangkan menggunakan ~ sebagai operator negatif unary yang akan memungkinkan -5 menjadi input sebagai ~ 5.
Diperlukan ruang putih untuk menggambarkan bilangan bulat. misalnya. +2 3
Nama parameter fungsi mungkin membebani variabel penelepon. Semua variabel yang ditugaskan dalam suatu fungsi adalah lokal.
Mencetak tidak perlu (walaupun bisa berguna) karena seperti LISP setiap pernyataan mengembalikan nilai, dan nilai terakhir yang dikembalikan dicetak.
Perilaku tak terduga notasi awalan tanpa tanda kurung adalah bahwa rangkaian string dapat dengan mudah ditulis. Katakanlah Anda ingin menyatukan
"a" " quick" " brown" " fox"
, seseorang dapat menulis:Tetapi metode yang lebih mudah dibaca dan lebih sedikit kesalahan adalah ini:
atau
99 botol kode bir:
Fungsi B mengembalikan "Tidak ada lagi botol" atau "1 botol" atau "botol" tergantung pada x.
Fungsi F mengembalikan ayat normal atau ayat terakhir. Sebuah ayat normal digabungkan dengan mengikuti ayat dengan memanggil F dengan -x1 secara rekursif. Ketika x adalah 0, F mengembalikan ayat terakhir.
Ini menghasilkan (untuk arti F5 mulai dari 5 botol bir ...):
1 juru bahasa (ditulis dalam bash) di bawah 500 baris.
sumber
@Mfxy{fxy}M+3 4
bekerja tetapi kemudian Anda harus bergabung dengan fungsi dan namespace variabel. Butuh waktu beberapa saat untuk menghitung 99 bir: pcons
Anda bisamap
M\x{*x2}C1C2C3C4/ => (2 4 6 8)
Setengah (penerjemah / penerjemah dalam Windows Batch)
Saya tidak tahu mengapa saya menjawab begitu banyak teka-teki di windows batch, untuk beberapa alasan sakit saya pikir saya menikmatinya: P Pokoknya, ini mirip dengan sesuatu yang saya kerjakan untuk bersenang-senang beberapa waktu lalu, bahasa dasar yang diterjemahkan ke batch windows oleh skrip yang juga ditulis dalam batch windows. Ini tidak terlalu luar biasa, tetapi berhasil.
99 Botol Bir
Sintaksis
Hanya tiga token yang dikenali pada setiap baris, dipisahkan oleh spasi.
# adalah komentar.
Dalam kebanyakan kasus di mana nilai diperlukan, a
$
dalam token kedua menandakan bahwa yang ketiga harus diperlakukan sebagai nama variabel, sedangkan a~
menunjukkan nilai literal. Instruksi umum berupa<instruction> [$~] <name>
. Pengaturan variabel mengambil bentuk yang sama, tetapi diimplementasikan setiap kali tidak dikenali.Perintah yang ditentukan:
print
danwrite
keduanya menulis output, tetapiwrite
tidak menambahkan baris baru. Membutuhkan $ atau ~.mark
menciptakan titik yang dapat dilompati atau disebut sebagai subrutin.jump
setara dengan goto dalam batch (atau bahasa apa pun dalam hal ini).proc
memanggil subrutin. Setara dengancall :label
.return
kembali dari subrutin. Akan keluar dari program saat tidak di dalam satu.if
instruksi bersyarat. Mengambil perbandingan dari baris berikutnya, dalam formulir<var1> <operator> <var2>
. Operator sama dengan yang adaif
di batch, yaitu.EQU, NEQ, LSS, LEQ, GTR, GEQ
. Akan menjalankan instruksi setelah itu hanya jika perbandingannya benar.endif
mengakhiri pernyataan if.cat
menggabungkan dua variabel.cat a b
akan menyimpan nilai ab dalam a.Ketika tidak ada perintah ini ditemukan, ekspresi diperlakukan sebagai penugasan variabel, menggunakan token pertama sebagai nama variabel.
$
dan~
berperilaku sama seperti diprint
, tetapi ada juga@
pengenal. Ini memperlakukan token terakhir sebagai ekspresi matematika, diteruskan keset /a
. Ini termasuk sebagian besar operator. Jika tidak ada dari ketiga pengidentifikasi yang ditemukan, ini adalah kesalahan sintaks dan penerjemah keluar.Penerjemah (Windows Batch)
Penerjemah sebenarnya menerjemahkan kode ke dalam batch windows, menempatkannya dalam file sementara dan menjalankannya. Meskipun mengenali kesalahan sintaks dalam bahasa Setengah, skrip kumpulan yang dihasilkan dapat menyebabkan masalah, terutama dengan karakter khusus seperti tanda kurung, bilah vertikal dll.
sumber
Flex Bison
Tetapkan variabel, jika kondisi lain blok dan beberapa tambahan lainnya, operasi pengurangan.
File longgar
lex.l
File pengurai
com.y
Menyusun
Lari
kompilasi in.txt ou.txt
Masukkan file
a = 3 + (4 * 7) -9; cetak a; c = a + 45; cetak c;
** Ini adalah komentar save c;
** simpan c dalam file cetak c * (a + 32);
File keluaran 67
sumber
Penerjemah
Untuk instruksi tentang cara menjalankan kode ini, lihat jawaban saya yang lain: /codegolf//a/19935/13186
99 Botol Bir
Program
sumber
99ISC
99ISC menggunakan memori berorientasi integer berukuran sewenang-wenang. Memori diindeks oleh integer non-negatif. Semua nilai dalam memori diinisialisasi dengan alamatnya. Misalnya. Saat runtime, alamat 0 berisi nilai 0 dan alamat 9 berisi nilai 9.
99ISC memiliki dua instruksi. Yang pertama mencetak 99 Botol Bir di Dinding rutin. Sintaksnya adalah satu baris, seperti di bawah ini. Eksekusi berlanjut dengan baris berikutnya dalam program.
Instruksi kedua adalah instruksi "kurangi dan cabang jika tidak sama dengan nol". Sintaksnya adalah satu baris, seperti di bawah ini.
x
adalah alamat nomor yang akan dioperasikan,y
adalah alamat nomor yang sedang dikurangi, danz
merupakan baris berikutnya yang akan dieksekusi jika hasil dari pengurangan tersebut tidak nol. Kalau tidak, eksekusi akan dilanjutkan dengan baris berikutnya.Kehadiran instruksi "kurangi-dan-cabang-jika-bukan-nol" menjadikan 99ISC sebagai OISC (One Instruction Set Computer) dan karenanya Turing lengkap.
Berikut adalah program yang menghapus 10 nilai pertama dalam memori dan kemudian mencetak 99 Botol Bir di Wall.
Dan di sini adalah penerjemah 99ISC, dengan Python.
sumber
Saya memberimu:
Interpreter Set Instruksi Kecil (SISI)
Sintaksnya mengacu pada BASIC dan assembly. Ia memiliki empat pernyataan:
set
,print
,jump
(tanpa syarat goto), danjumpif
(goto bersyarat). Setiap pernyataan harus didahului dengan nomor baris. Tipe data yang didukung adalah bilangan bulat dan string.Penerjemah itu sendiri dapat ditemukan dalam Python 3 di Github (sisi.py). Program 99 Botol Bir juga ada di sana, tetapi saya akan mereproduksinya di sini:
sumber
Pogo
https://github.com/nrubin29/Pogo
sumber
i
dan mengaturnya sama dengan 99. Kemudian, ketika saya lebih besar dari 0, saya mencetaki bottles of beer on the wall
dan mengurangi satu darii
. Jika masalahnya adalah saya kekurangan beberapa lirik, saya dapat menambahkan lebih banyak.