Berkenalan dengan ANTLR untuk Membuat Bahasa Bot Engine Sederhana

Aditya Purwa
Pujangga Teknologi
Published in
3 min readFeb 7, 2019

Bismillahirrahmanirrahim.

ANTLR (Another Tool for Language Recognition) adalah satu alat yang bisa kita gunakan untuk membuat lexer dan parser secara otomatis cukup dengan menggunakan file grammar.

Tentang Lexer dan Parser

Lexer adalah suatu komponen yang berfungsi untuk mendeteksi bagian terkecil (token) dari suatu bahasa. Proses pendeteksian ini disebut lexing. Biasanya regular expressions digunakan untuk melakukan proses lexing karena bentuk token biasanya sangat sederhana.

Sedangkan parser berfungsi sebagai komponen yang mendeteksi struktur dari beberapa token. Proses pendeteksian ini disebut parsing. Proses parsing lebih rumit daripada lexing, sehingga regular expression kurang cocok untuk digunakan di sini.

Karena proses pembuatan lexer dan parser cukup melelahkan jika dilakukan secara manual. Dibuatlah ANTLR oleh Terence Parr untuk memudahkan proses pembuatan lexer dan parser secara otomatis.

Membuat Bahasa Bot Engine

Kita akan mencoba menggunakan ANTLR untuk membuat bahasa yang digunakan untuk mendefinisikan perilaku sebuah chatbot. Sebenarnya yang kita bahas adalah contoh yang pernah saya bikin setahun yang lalu. Tulisan ini sekaligus menjadi penyegar ingatan saya tentang ANTLR.

Kunjungi situs resmi ANTLR untuk panduan installasi dan setup ANTLR.

Arubick

Tahun lalu sempat membuat sebuah bahasa chatbot sederhana yang saya beri nama Arubick, terinspirasi dari nama hero di DoTA 2. Kalian bisa mengaksesnya di https://github.com/adityapurwa/Arubick.

Rubick, yang juga terinspirasi dari nama lain; Erno Rubik — Pembuat Rubik’s Cube.

Arubick adalah sebuah bahasa sederhana untuk membuat chatbot, project ini merupakan tempat saya belajar tentang ANTLR dan cara membuat interpreter. Arubick didesain untuk berjalan di atas Node.js, dan menggunakan TypeScript sebagai bahasa pemrogramannya.

Jadi bagaimana bentuk bahasa yang akan kita buat? Contoh sederhana yang ada di readme repository Arubick adalah sebagai berikut:

Bagi kalian yang ingin mendesain sebuah bahasa, saya sarankan membuat contohnya terlebih dahulu daripada aturan-aturannya terlebih dahulu. Contoh lebih mudah untuk diubah-ubah dan kita bisa merasakan seperti apa hasil akhir bahasa yang akan dibuat.

Lalu seperti apa bentuk grammar ANTLR yang harus kita buat untuk memproses bahasa di atas?

Pertama kita harus membuat lexer yang akan memproses token yang ada di Arubick.

Ketika kita sudah selesai mendefinisikan bagian terkecil dari bahasa kita. Kita tentukan bagaimana bagian-bagian tersebut harus disusun untuk menjadi sebuah struktur grammar.

Sekarang kita sudah punya grammar yang dibutuhkan untuk memproses bahasa kita. Kita tinggal meminta ANTLR untuk mengenerate kode yang akan digunakan untuk memproses Arubick.

Karena saya menggunakan antlr4ts, maka saya gunakan perintah antlr4ts untuk menghasilkan kode parser dan lexernya.

$ antlr4ts src/antlr/Arubick.g4 -o src/antlr

Ada 6 jenis file yang akan dihasilkan:

  • Arubick.tokens
  • ArubickLexer.token
  • ArubickLexer.ts
  • ArubickListener.ts
  • ArubickParser.ts
  • ArubickVisitor.ts

Kita tidak perlu mengotak-atik file yang dihasilkan oleh ANTLR, yang kita butuhkan adalah membuat kode yang akan memanfaatkan file tersebut.

Inti dari penggunaan dari parser yang dibuat oleh ANTLR adalah, kita mengambil rule yang sudah kita buat. Lalu memprosesnya. Baik itu rule seperti expression, statement, ataupun variable. Dari rule kita dapatkan rule atau token lainnya yang terkait.

Ada satu hal yang menarik dari Arubick, yaitu async. Karena saya tidak pernah membuat interpreter sebelumnya dan tidak punya acuan referensi tertentu, akhirnya saya mengira-ngira dan mencoba-coba cara untuk implementasi async di Arubick.

Di Arubick, tidak ada API untuk pattern async seperti Promise di JavaScript. Sehingga harus dihandle di interpreternya langsung.

Kesimpulan

ANTLR mempermudah proses pembuatan lexer dan parser. Tanpa ANTLR, kita harus menulis sendiri file yang mirip dengan hasil generate dari ANTLR. Isi dari file tersebut repetitif, meskipun bisa diketik secara manual; jauh lebih cepat jika kita menggunakan tool seperti ANTLR untuk melakukan pekerjaan repetitif tersebut.

Sekian dan terima kasih, semoga bermanfaat!

P.S. Jika teman-teman menyukai artikel semacam ini, silakan subscribe ke newsletter kita dan dapatkan notifikasi artikel terbaru langsung di inbox kamu!

--

--

Aditya Purwa
Pujangga Teknologi

Building Playtune (https://playtune.app) - Software engineer, writer, designer, and artist.