BERBASIS PYTHON
LAPORAN
Disusun untuk memenuhi tugas proyek akhir Mata Kuliah Teknik Kompilasi
Dosen Pengampu : Aji Purwinarko, S. Si., M. Cs.
Uswanto (4611421142)
2022
DAFTAR ISI
1
BAB 1
PENDAHULUAN
2
1.3. Tujuan
Melalui laporan ini, beberapa tujuan yang ingin dicapai oleh penulis adalah
sebagai berikut.
1. Mengetahui hubungan antara bahasa pemrograman dengan mesin
compiler.
2. Mengidentifikasi tahapan-tahapan dalam pembuatan mesin compiler.
3. Mempelajari implementasi mesin compiler dengan bahasa pemrograman
python.
4. Mengimplementasikan mesin compiler dengan bahasa pemrograman
BOLT-11.
1.4. Manfaat
Setelah penyusunan laporan ini, beberapa manfaat yang akan didapatkan penulis
maupun pembaca adalah sebagai berikut.
1. Mengetahui lebih dalam mengenai bahasa pemrograman dan mesin
compiler.
2. Memahami kriteria dan tahapan dalam pembuatan mesin compiler.
3. Mengimplementasikan algoritma mesin compiler dengan bahasa
pemrograman python.
4. Memudahkan dalam mempelajari konsep-konsep dalam materi di Mata
Kuliah Teknik Kompilasi.
3
BAB 2
KAJIAN PUSTAKA
1. Program merupakan himpunan atau kumpulan instruksi tertulis yang dibuat oleh
programmer atau suatu bagian executable dari suatu software.
2. Pemrograman berarti membuat program komputer.
3. Pemrograman merupakan suatu kumpulan urutan perintah ke komputer untuk
mengerjakan sesuatu. Perintah-perintah ini membutuhkan suatu bahasa
tersendiri yang dapat dimengerti oleh komputer.
4. Mendeskripsikan instruksi-instruksi tersendiri yang biasanya disebut source
code yang dibuat oleh programmer.
5. Mendeskripsikan suatu keseluruhan bagian dari software yang executable.
1. Bahasa Mesin
Merupakan bahasa yang hanya dapat dimengerti oleh mesin komputer,
yang didalamnya terdapat Central Processing Unit (CPU) yang hanya mengenal
dua keadaan yang berlawanan, yaitu bila ada arus maka bernilai 1 (true), dan jika
tidak ada arus maka bernilai 0 (false).
4
Sedangkan compiler adalah perangkat lunak sistem yang melakukan
proses transformasi terhadap suatu program sumber menjadi program target.
Dalam hal ini, program sumber yang digunakan adalah bahasa pemrograman
tingkat tinggi, dan program targetnya berupa bahasa assembly. Sebagai
penerjemah, compiler harus mampu membimbing penggunanya apabila terdapat
kesalahan dalam program sumber.
SLY adalah library yang digunakan untuk menulis parser dan compiler. SLY
secara bebas didasarkan pada alat konstruksi tradisional compiler Lex dan Yacc dan
mengimplementasikan algoritma parsing LALR yang sama. Sebagian besar fitur
yang tersedia di Lex dan Yacc juga tersedia di SLY.
SLY menyediakan dua kelas terpisah yaitu Lexer dan Parser. Kelas Lexer
digunakan untuk memecah teks input menjadi kumpulan token yang ditentukan oleh
kumpulan aturan ekspresi reguler. Sedangkan kelas Parser digunakan untuk
mengenali sintaks bahasa yang telah ditentukan dalam bentuk tata bahasa bebas
konteks. Dua kelas biasanya digunakan bersama untuk membuat parser. Namun, ini
bukan persyaratan ketat (ada banyak fleksibilitas yang diperbolehkan).
class BoltLexer(Lexer):
tokens = { NAME, NUMBER, STRING, IF, PRINT, THEN,
ELSE, FOR, FUN, TO, ARROW, EQEQ }
ignore = '\t '
# Pendefinisian Token
IF = r'JIKA'
PRINT = r'CETAK'
THEN = r'MAKA'
ELSE = r'KEMUDIAN'
5
FOR = r'UNTUK'
FUN = r'FUNGSI'
TO = r'SAMPAI'
ARROW = r'->'
NAME = r'[a-zA-Z_][a-zA-Z0-9_]*'
STRING = r'\".*?\"'
EQEQ = r'=='
class BoltParser(Parser):
tokens = BoltLexer.BoltLexer.tokens
precedence = (
('left', '+', '-'),
('left', '*', '/'),
('right', 'UMINUS'),
)
def __init__(self):
self.env = { }
@_('')
def statement(self, p):
pass
6
def statement(self, p):
return ('fun_def', p.NAME, p.statement)
@_('var_assign')
def statement(self, p):
return p.var_assign
@_('expr')
def statement(self, p):
return(p.expr)
7
@_('expr "*" expr')
def expr(self, p):
return ('mul', p.expr0, p.expr1)
@_('NAME')
def expr(self, p):
return('var', p.NAME)
@_('NUMBER')
def expr(self, p):
return('num', p.NUMBER)
@_('PRINT expr')
def expr(self, p):
return ('print', p.expr)
@_('PRINT STRING')
def statement(self, p):
return ('print', p.STRING)
8
yang ditulis oleh programmer dengan mengeksekusi baris demi baris. Berbeda dengan
proses compiler, yang mana proses compiler akan langsung menghasilkan program
berupa satu kesatuan perintah dalam bentuk bahasa mesin, dan proses penerjemahan
dilakukan sebelum program tersebut dieksekusi.
class BoltExecute:
9
result = self.walkTree(node[1])
if result:
return self.walkTree(node[2][1])
return self.walkTree(node[2][2])
if node[0] == 'condition_samadengan':
return self.walkTree(node[1]) ==
self.walkTree(node[2])
if node[0] == 'func_def':
self.env[node[1]] = node[2]
if node[0] == 'func_call':
try:
return self.walkTree(self.env[node[1]])
except LookupError:
print("Undefined function '%s'" % node[1])
return 0
if node[0] == 'add':
return self.walkTree(node[1]) +
self.walkTree(node[2])
elif node[0] == 'sub':
return self.walkTree(node[1]) -
self.walkTree(node[2])
elif node[0] == 'mul':
return self.walkTree(node[1]) *
self.walkTree(node[2])
elif node[0] == 'div':
return int(self.walkTree(node[1]) /
self.walkTree(node[2]))
if node[0] == 'var_assign':
self.env[node[1]] = self.walkTree(node[2])
return node[1]
if node[0] == 'var':
try:
return self.env[node[1]]
except LookupError:
print("Undefined variable
'"+node[1]+"' found!")
return 0
if node[0] == 'for_loop':
if node[1][0] == 'for_loop_setup':
10
loop_setup = self.walkTree(node[1])
loop_count = self.env[loop_setup[0]]
loop_limit = loop_setup[1]
for i in range(loop_count+1,
loop_limit+1):
res = self.walkTree(node[2])
if res is not None:
print(res)
self.env[loop_setup[0]] = i
del self.env[loop_setup[0]]
if node[0] == 'for_loop_setup':
return (self.walkTree(node[1]),
self.walkTree(node[2]))
lexer = BoltLexer.BoltLexer()
parser = BoltParser.BoltParser()
env = {}
file = open(argv[1])
text = file.readlines()
for line in text:
tree = parser.parse(lexer.tokenize(line))
BoltExe.BoltExecute(tree, env)
11
BAB 3
HASIL DAN PEMBAHASAN
12
Pada Bolt, perintah UNTUK jika diikuti dengan ekspresi, perintah
SAMPAI diikuti dengan statement 1, dan perintah MAKA diikuti dengan
statement 2, maka dapat digunakan untuk melakukan looping pada program
dengan logika FOR dan TO.
13
BAB 4
KESIMPULAN DAN SARAN
4.1. Kesimpulan
4.2. Saran
Walaupun mesin compiler dapat menjalankan perintah dengan baik, tetapi
masih banyak kesalahan yang ditemui apabila mengimplementasikan algoritma
yang lebih kompleks. Melalui hal ini, penulis disarankan lebih bisa
mengembangkannya menjadi lebih sempurna, sehingga turut andil dalam
kontribusi membangun Ilmu Pengetahuan dan Teknologi (IPTEK).
14
DAFTAR PUSTAKA
Purwa, Aditya . (2019) . Berkenalan dengan ANTLR untuk Membuat Bahasa Bot Engine
Sederhana . Diakses di https://medium.com/pujanggateknologi/berkenalan-
dengan-antlr-untuk-membuat-bahasa-bot-engine-sederhana-cf1292950f98 pada
24 Maret 2022
Apriansyah, Andez., Saputra, Tri Ichsan., Fauziah., & Wijaya, Yunan Fauzi. (2019).
Desain Mesin Compiler untuk Penganalisa Leksikal, Sintaksis, Semantik, Kode
Antara dan Error Handling Pada Bahasa Pemrograman Sederhana.
15