Você está na página 1de 14

TUGAS 1 TEKNIK KOMPILASI

PEMBUATAN SCANNER

Oleh :
ANGGI NAMORA SITEPU (131401092)

PROGRAM STUDI S1 ILMU KOMPUTER


FAKULTAS ILMU KOMPUTER DAN TEKNOLOGI INFORMASI
UNIVERSITAS SUMATERA UTARA
MEDAN
2016

DAFTAR ISI

Daftar Isi.................................................................................................................................i
BAB I ANALISIS LEKSIKAL

1.1 Analisis Leksikal................................................................................................1


1.2 Posisi Analisis Leksikal dalam Kompilator.......................................................2
BAB II PERANCANGAN SCANNER

2.1 Bahasa Pemrograman yang Digunakan (C#).....................................................3


2.2 Bahasa Sumber Analisa (Pascal)........................................................................3
2.3 Penentuan Nama Token.....................................................................................4
2.4 Algoritma/Flowchart Penghapusan Komentar dan Whitespace........................4
2.5 Tahapan Pengerjaan RE.....................................................................................4
2.6 Finite State Automata.........................................................................................5
BAB III SCREENSHOT

3.1 Screenshot Scanner............................................................................................6


BAB IV KESIMPULAN

4.1 Kesimpulan Laporan..........................................................................................5


BAB V SOURCECODE

5.1 Sourcecode Program..........................................................................................7

BAB I

ANALISIS LEKSIKAL

1.1 Analisis Leksikal


Analisis Leksikal/Analisis Linier/Pembacaan Sekilas (Scanner). Dalam kaitan ini
aliran karakter yang membentuk program sumber dibaca dari kiri ke kanan dan
dikelompokkan dalam apa yang disebut token yaitu barisan dari karakter yang dalam
suatu kesatuan mempunyai suatu arti tersendiri.
Analisis ini melakukan penerjemahan masukan menjadi bentuk yang lebih berguna
untuk tahap-tahap kompilasi berikutnya. Analisis Leksikal merupakan antarmuka
antara kode program sumber dan analisis sintaktik (parser). Scanner melakukan
pemeriksaan karakter per karakter pada teks masukan, memecah sumber program
menjadi

bagian-bagian

disebut

Token.

Analisis

Leksikal

mengerjakan

pengelompokkan urutan-urutan karakter ke dalam komponen pokok: identifier,


delimeter, simbol-simbol operator, angka, keyword, noise word, blank, komentar, dan
seterusnya menghasilkan suatu Token Leksikal yang akan digunakan pada Analisis
Sintaktik.
Model dasar untuk membentuk suatu Analisis Leksikal adalah Finite-State Automata,
2 aspek penting pembuatan Analisis Leksikal adalah:

Menentukan token-token bahasa.

Mengenali token-token bahasa dari program sumber.

Token-token dihasilkan dengan cara memisahkan program sumber tersebut


dilewatkan ke parser. Analisis Leksikal harus mengirim token ke parser. Untuk
mengirim token, scanner harus mengisolasi barisan karakter pada teks sumber yang
merupakan 1 token valid. Scanner juga menyingkirkan informasi seperti komentar,
blank, batas-batas baris dan lain-lain yang tidak penting (tidak mempunyai arti) bagi
parsing dan Code Generator.
Scanner juga harus dapat mengidentifikasi token secara lengkap dan
membedakan keyword dan identifier. Untuk itu scanner memerlukan tabel simbol.
Scanner memasukkan identifier ke tabel simbol, memasukkan konstanta literal dan
numerik ke tabel simbol sendiri setelah konversi menjadi bentuk internal.

Analisis Leksikal merupakan komponen kompilasi independen yang


berkomunikasi dengan parser lewat antarmuka yang terdefinisi bagus dan sederhana
sehingga pemeliharaan analisis leksikal menjadi lebih mudah dimana perubahanperubahan terhadap analisis leksikal tidak berdampak pada pengubahan kompilator
secara keseluruhan. Agar dapat memperoleh fitur ini, maka antarmuka harus tidak
berubah. Kebanyakan kode yang menyusun analisis leksikal adalah sama untuk
seluruh kompilator, tidak peduli bahasa.
Pada analisis leksikal yang dituntun tabel (table-driven lexical analyzer), maka
satu-satunya yang berubah adalah tabel itu sendiri. Kadang diperlukan interaksi
analisis leksikal dan analisis sintaktik yang lebih kompleks. Sehingga analisis leksikal
harus dapat menganggap string sebagai token bertipe, bukan identifier. Untuk itu
perlu komunikasi tingkat lebih tinggi yang biasanya dilakukan suatu struktur data
dipakai bersama seperti tabel simbol. Analisis Sintaktik dapat memasukkan string ke
tabel simbol, mengidentifikasi sebagai Type atau typedef, sehingga analisis leksikal
dapat memeriksa tabel simbol untuk menentukan apakah lexeme adalah tipe token
atau identifier.
1.2 Posisi Analisis Leksikal dalam Kompilator
Analisis Leksikal merupakan tahap awal dalam proses kompilasi sebuah
bahasa. Mengapa analisis leksikal diperlukan ? Hal tersebut dikarenakan analisis
leksikal/scanner akan menghasilkan token-token yang akan memudahkan proses
selanjutnya yaitu parsing.
Analisis leksikal menangani kerumitan sistem masukkan/keluaran. Karena
analisis leksikal biasanya berhubungan langsung dengan kode sumber yang diwadahi
file, maka analisis leksikal juga bertindak sebagai benteng untuk komponenkomponen lain di kompilator dalam mengatasi keanehan-keanehan sistem
masukkan/keluaran sistem operasi dan sistem komputer.
Analisis leksikal juga memiliki beberapa tugas spesifik yaitu seperti
penghilangan komentar dan whitespace (tab,spasi,karakter lainnya).Tindakan
housekeeping dilakukan scanner sehingga mengisolasikan dari parser dan komponenkomponen kompilator lain.
Peran ini menyederhanakan perancangan parser (dan grammar bahasa
pemrograman). Scanner juga mencatat nomor baris saat itu sehingga penanganan
kesalahan yang cerdas dapat mengirim pesan kesalahan dengan lebih akurat. Hal ini
lah yang mendasari bahwa posisi analisis leksikal dalam proses kompilasi bahasa
sangatlah penting.

BAB II

PERANCANGAN SCANNER

2.1 Bahasa Pemrograman yang digunakan (C#)


Bahasa pemograman C-Sharp (C#) dikembangkan oleh Microsoft sebagai
bahasa yang simple, modern, general-purpose, dan berorientasi objek. Pengembangan
bahas C# sangat dipengaruhi oleh bahasa pemograman sebelumnya, terutama C++,
Delphi, dan Java. C++ Dikenal memiliki kecepatan yang tinggi dan memiliki akses
meomori hingga ke level terendah. Namun bagi programmer, bahasa C++ relative
lebih sulit dibanding bahasa pemograman lainnya. Bahasa C# sampai saat ini masih
terus dikembangkan untuk melakukan berbagai task, tetapi dalam hal performance C+
+ masih di akui sebagai salah satu yang terbaik sampai saat ini.
C# dikembangkan sejalan dengan pengembangan teknologi .Net. .Net
merupakan sebuah framework yang memiliki base class library dan bisa
diimplementasikan dalam beberapa bahasa pemograman yang dikembangkan oleh
Microsoft. Microsoft .Net framework adalah perantara perantara agar aplikasi dengan
bahasa pemograman yang didukung dapat berkomunikasi dengan system operasi yang
digunakan oleh computer. .Net framework juga memungkinakan C# untuk
berkomunikasi

dengan

bahasa

pemograman

lainnya

yang

didukung

oleh

framework .Net seperti VB.Net, F#, atau C++.


Salah satu karakteristik .Net adalah Common Language Runtime (CLR). CLR
merupakan komponen virtual machine yang akan mengeksekusi program pada saat
runtime. Code yang di tulis dalam bahasa C# atau VB.Net akan di compile menjadi
kode dalam format Common Intermediate Language (CIL).
2.2 Bahasa Sumber Analisa (Pascal)
Pascal adalah salah satu bahasa pemrograman komputer yang umumnya
digunakan sebagai pengantar untuk mulai belajar algoritma dan pemrograman. Pascal
relatif mudah dipelajari karena perintah-perintahnya yang mirip dengan bahasa
inggris sehari-hari seperti begin, end, write, dan read.
Pascal diambil dari nama ahli matematika prancis abad pertengahan, Blaise
Pascal. Bahasa Pascal di kembangkan oleh Niklaus Wirth pada tahun 1970, dan
populer digunakan pada era 1970 hingga awal 1990an.
2.3 Penentuan Nama-nama Token
Token token yang diambil dibagi menjadi beberapa leksikal yaitu :

Keyword / Reserved Words:


And
Array
Asm
Begin
Case
Const
Constructor
Destructor
Div
Do

Export
Nil
Not
Object
Or
Or
Packed
Procedure
Program
Record

Shl
Shr
File
For
Function
Goto
If
Implementation
In
Inherited

Label
Library
Mod
String
Then
To
Type
Unit
Until
Uses

With
Xor
Else
Set
Interface
While
Downto
Repeat
Inline
Var

Identifier :
Semua letter yang memiliki syarat :
-> [a-z][A-Z][0-9] [a-z][A-Z]
Operator :
Semua operator yang biasa dipakai dalam Pascal
-> + , - , / , * , := , mod , div
Relational Operator(Operasi Logika) :
Semua operator logika yang biasa dipakai dalam Pascal
-> < , > , = , <= , >= , !=
Delimiter :
Semua bentuk pungtuasi dan kurung yang biasa dipakai dalam Pascal
-> ( , ) , [ , ] , , , . , : , ;
Konstanta (Integer) :
Semua bilangan yang termasuk dalam bilangan integer
-> [0-9][0-9]
2.4 Algoritma Penghapusan WhiteSpace dan Komentar
Whitespace
Procedure spaces
Begin
While karakter= do getchar;
Repeat
Case karakter of
: begin //menentukan spasi
Delete karakter; //penhapusan spasi
Repeat getchar;
End;
EOF:exit;
End;
Komentar
Procedure comment
Begin
While karakter= do Getchar;

Repeat
Case karakter of
{ : begin //penentuan awal kurung komentar
repeat Getchar; //men-scan seluruh karakter dan mengabaikannya
//sampai akhir kurung komenter ditemukan
until karakter=}; //menentukan akhir kurung komentar
end;
EOF:exit;
End;

2.5 Tahapan Pengerjaan Regular Expression (RE)


Regular expressions adalah deskripsi yang dapat digunakan untuk
menggambarkan bahasa regular. Sebuah bahasa dinyatakan regular jika terdapat finite
state automata yang dapat menerimanya. Bahasa-bahasa yang diterima oleh suatu
FSA bisa dinyatakan secara sederhana dengan ekspresi regular. Ekspresi Regular
(ER), memungkinkan menspesifikasikan atau mendefinisikan bahasa-bahasa. Ekspresi
Regular memberikan suatu pola dari suatu bahasa. String/untai yang menyusun suatu
bahasa regular akan cocok dengan pola bahasa itu.
Notasi Ekspresi Regular

Supescript * : berarti bisa tidak muncul, bisa juga muncul berhingga kali (0-n)
Superscript + : berarti minimal muncul satu kali (1-n)
+ : berarti union atau bisa diganti dengan notasi U
. : berarti konkatenasi, biasanya tanpa ditulis titiknya, misal ab sama dengan a.b
Regular Expression
Identifier :
letter(letter|digit)*
-> dengan artian set yang dapat menjadi identifier ialah yang dimulai dengan letter
([a-z]|[A-Z]) lalu diikuti dengan boleh letter ([a-z]|[A-Z]) juga atau digit ([0-9]), dan
dapat diulang.
Number /Integer:
digit*
-> dengan artian bahwa semua nilai bilangan yang integer dapat diterima kecuali
bilangan real, imaginer , dsb.
Delimiter
(: | ; | . | , | [ | ] | ( | ) )*
-> dengan artian bahwa semua symbol yang dapat digunakan sebagai delimiter dalam
pascal dapat diterima dan dapat berulang
Operator :
(+ | - | * | mod | div)*

->dengan artian bahwa semua operator aritmatika dasar dapat diterima sebagai
inputan
Operator Logika :
( := | = | > | < | <= | >=)
-> dengan artian bahwa semua operator logika yang biasa digunakan dapat diterima.

2.6 Finite State Automata


Mengambil input berupa string dan menentukan apakah string tersebut merupakan
kalimat yang sah dari suatu bahasa.
Sebuah finite automaton memiliki states yang terhingga
Sisi membawa dari satu state ke state selanjutnya
Sisi diberi label symbol
Satu state merupakan start state
Satu atau lebih state merupakan final state
Contoh :
Misalkan sebuah sebuah bahasa memiliki himpunan simbol terminal / token yaitu : < ,
> , =, <= , >=, <> . Atau bisa dibaca sebagai token-token : t_L, t_G, t_E, t_LE, t_GE,
t_NE ( G=Greater, L=Less, E=Equal, N=not)
Bahasa tersebut juga mendukung penulisan komentar yang diawali dengan { dan
diakhiri }.
Maka diagram state untuk bahasa tersebut :

<
Start

=
t_L

t_LE

>
>

t_NE

t_E

Koment
Apa saja selain }

t_G

t_GE

BAB III
SCREENSHOT

3.1 Screenshot Scanner

BAB IV
KESIMPULAN

4.1 Kesimpulan Laporan


Analisis Leksikal adalah tahap pertama/awal dalam proses kompilasi , mendahului
proses analisis sintaksis/parsing dan analisis semantic. Tugas utama analisis leksikal
adalah untuk memecah bahasa sumber kedalam bentuk token token terorganisis
dimana token token tersebut akan dilanjutkan ke dalam proses parsing.
Token token yang telah dihasilkan dalam proses leksikal terdiri dari beberapa seperti
identifier, keyword, konstanta, operator dsb. Dan token-token ini diperoleh dengan
menggunakan Finite State Automata.
Dan dengan munculnya token-token dalam scanner maka scanner dapat dinyatakan
berjalan dengan baik.

BAB V

SOURCE CODE

5.1 Source code Program


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Drawing;
using System.Windows.Forms;
namespace latihan1
{
/// <summary>
/// Description of MainForm.
/// </summary>
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
void Button1Click(object sender, EventArgs e)
{

string coding=tb1.Text;
tokens.Clear();
cektokens.Clear();
string result="";
bool error=false;
> Code untuk menghapus komentar dan whitespace
string clear=tb1.Text;
clear = clear.Replace(" ", "");
clear = Regex.Replace(clear, @"\{(.*)\}", "");
tb2.Text = clear;
string temp="";
for(int i=0;i<coding.Length;i++){
if(char.IsWhiteSpace(coding[i])){
i++;
while (i<coding.Length){

if(char.IsWhiteSpace(coding[i])){
i++;
}
else {i--; break;}
}
if(temp != ""){
tokens.Add(temp);
}
temp="";
}
else {temp += coding[i];}
}
if (temp !="") tokens.Add(temp);
for(int i=0;i<tokens.Count;i++){
if(_keyword(tokens[i])){
cektokens.Add(tokens[i] +" \t:
keyword"+System.Environment.NewLine);
}
else if(_id(tokens[i])){
cektokens.Add(tokens[i] +" \t: id"+System.Environment.NewLine);
}
else if(_int(tokens[i])){
cektokens.Add(tokens[i] +" \t: int"+System.Environment.NewLine);
}
else if(_opr(tokens[i])){
cektokens.Add(tokens[i] +" \t: opr"+System.Environment.NewLine);
}
else if(_oprlogika(tokens[i])){
cektokens.Add(tokens[i] +" \t: logopr"+System.Environment.NewLine);
}
else if(_delimiter(tokens[i])){
cektokens.Add(tokens[i] +" \t:
delimiter"+System.Environment.NewLine);
}
}
if (error){}
else{for (int i=0;i<cektokens.Count;i++){
result += cektokens[i] +"";
}
} tb2.Text=result;
}

List<string> tokens=new List<string>();


List<string> cektokens=new List<string>();
string[] keyword={"and","array","asm","begin","case","const","constructor","div
","do","export","nil","not","object","of","or","packed","procedure",
"program","record","shl","shr","file","for","function","goto","if","i
mplementation","in","inherited","label","library","mod","string",
"then","to","type","write","writeln","read","wincrt","crt","readln","u
nit","until","uses","wih","xor","else","set","interface","while","begin","end","downto
","repeat","inline","var","integer","byte","longint"};
string[] opr={"+","-","/","*",":=","mod","div"};
string[] log={"<",">","=","<=",">=","!="};
string[] del={".",",",":",";","(",")","[","]"};
> Untuk menentukan keyword pada pascal dengan memanfaatkan table
symbol (dengan menggunakan array)
bool _keyword(string lex){
for (int i=0;i<keyword.GetLength(0);i++){
if(lex==keyword[i]) return true;
}
return false;
}
>Untuk membaca bilangan bulat diawali digit 0-9, bisa diikuti digit 0-9
bool _int(string lex){
for (int i=0;i<lex.Length;i++){
if(lex[i]>= '0' && lex[i]<='9'){
return true;
}
else {return false;}
}
return true;
}

bool _opr(string lex){


for (int i=0;i<opr.GetLength(0);i++){
if(lex==opr[i]) return true;
}
return false;
}
bool _oprlogika(string lex){
for (int i=0;i<log.GetLength(0);i++){
if(lex==log[i]) return true;

}
return false;
}
bool _delimiter(string lex){
for (int i=0;i<del.GetLength(0);i++){
if(lex==del[i]) return true;
}
return false;
}
> Untuk menentukan identifier beserta atributnya
bool _id(string lex){
if(lex[0]>='a' && lex[0] <='z'){
for(int i=0;i<lex.Length;i++){
if(lex[i]>='a' && lex[i] <='z'){
}
else if(lex[i]>='0' && lex[i]<='9'){
}
else{
return false;
}
}
return true;
}
return false;
}
}
}

Você também pode gostar