Makalah Teknik Kompilasi
Makalah Teknik Kompilasi
MEDAN
2016
KATA PENGANTAR
Puji dan syukur penulis panjatkan ke hadirat Allah SWT, karena atas rahmat-Nya sehingga penulis
dapat menyelesaikan makalah ini sesuai dengan batas waktu yang telah ditentukan. Adapun
makalah ini berjudul “PEMBUATAN SCANNER UNTUK BAHASA PEMROGRAMAN
PASCAL DENGAN MENGGUNAKAN BAHASA PEMROGRAMAN C PADA
SOFTWARE DEV-C++” yang merupakan salah satu tugas dari dosen mata kuliah Teknik
Kompilasi, yaitu Ibu Amalia, ST, MT.
Makalah ini telah penulis susun dengan maksimal dan mendapatkan bantuan dari berbagai
pihak sehingga dapat memperlancar pembuatan makalah ini. Untuk itu penulis menyampaikan
banyak terima kasih kepada semua pihak yang telah berkontribusi dalam pembuatan makalah ini.
Terlepas dari semua itu, penulis menyadari sepenuhnya bahwa masih ada kekurangan baik dari
segi susunan kalimat maupun tata bahasanya. Oleh karena itu dengan tangan terbuka menerima
segala saran dan kritik dari pembaca demi perbaikan makalah ini ke depannya. Akhir kata penulis
berharap semoga makalah ini dapat bermanfaat dan menambah wawasan bagi pembaca dan
khususnya bagi penulis juga.
Fadhilah Atika
Nim: 131401143
i
DAFTAR ISI
A. ANALISIS LEKSIKAL
1
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.
Dari fungsi scanner secara umum seperti telah disebutkan di atas, maka tugas scanner
secara rinci adalah:
1. membaca serangkaian karakter dari source code
2. mengenalinya ke dalam satuan leksikal
3. mengubahnya menjadi token dan menentukan jenis token-nya.
4. mengirimkan token ke proses analisis selanjutnya, yaitu analisis sintaksis
5. mengabaikan karakter white space (spasi, enter, ganti baris, penanda akhir file)
dan komentar (remark) apabila ada di dalam source code
6. menangani error
7. menangani tabel symbol
2
2.3 Tugas-tugas tambahan Analisis Leksikal
Konversi literal/konstanta numerik menjadi tipe data tertentu. Analisis leksikal dapat
mengirim token, dan nilainya. Nilai ini biasa disebut atribut. Namun demikian, bila analisis
leksikal ditambahin dengan tugas-tugas tambahan yang terlalu banyak juga akan menjadi
tidak baik. Karena itu membatasi analisis
leksikal hanya untuk melakukan tugas pengenalan pola token (ditambah membuang
komentar) adalah mempermudah pemeliharaan.
Terjadi interaksi antara scanner dan parser. Sacnner dipanggil saat parser
memerlukan token berikutnya. Pendekatan ini lebih baik karena bentuk internal program
sumber yang lengkap tidak perlu dibangun dan disimpan di memori sebelum parsing
dimulai.
3
Scanner mengirim nilai-nilai integer yang mempresentasikan bentuk internal token,
bukan nilai-nilai string.
Keunggulan cara ini adalah ukurannya kecil dan tetap. Parser sangat lebih efisien
bekerja dengan nilai integer yang mempresentasikan simbol daripada string nyata dengan
panjang variabel.
Pengenalan Token.
Pendeskripsian Token.
Pada pemodelan analisis leksikal sebagai pengenal yang menerapkan finite automata,
analisis leksikal tidak cuma hanya melakukan mengatakan YA atau TIDAK. Dengan
demikian selain pengenal, maka analisis leksikal juga melakukan aksi-aksi tambahan yang
diasosiasikan dengan string yangsedang diolah.
Analisis leksikal dapat dibangun dengan menumpangkan pada konsep pengenal yang
berupa finite automata dengan cara menspesifikasikan rutin-rutin (aksi-aksi) tertentu
terhadap string yang sedang dikenali.
4
Penanganan Kesalahan di Analisis Leksikal Hanya sedikit kesalahan yang
diidentifikasi di analisis leksikal secara mandiri karena analisis leksikal benar-benar
merupakan pandangan sangat lokal terhadap program sumber.
Bila ditemui situasi dimana analisis leksikal tidak mampu melanjutkan proses karena
tidak ada pola token yang cocok, maka terdapat beragam alternatif pemulihan. yaitu:
Scanner bekerja berdasarkan prinsip mesin finite state automata (FSA). Diagram
keadaan dapat digunakan untuk membantu mengkonstruksi scanner.
begin clrscr;
end.
5
Dari contoh di atas, maka identifier yang dideklarasikan sendiri oleh pemakai
(variabel) adalah: nama, alamat, jumlah_anak, dan nominal_tabungan. Sedangkan
identifier kata tercadang (reserve word) adalah: var, string, byte, real, begin, clrscr,
dan end. Selain contoh yang disebutkan di atas, masih banyak kata tercadang yang
lainnya.
b. Nilai konstanta
Nilai konstanta disini dapat berupa: integer, real, boolean, character, string, dan
sebagainya. Melalui contoh berikut ini, bedakan antara nilai (atau isi) dengan
variabel yang digunakan untuk menyimpannya.
6
hitung_luas := panjang * lebar; x :=
1000; ulang := false; luas_lingkaran
:= 3.14 * jejari * jejari; nama := budi
hartono;
Dari contoh di atas, maka: 1000, false, 3.14, ’budi hartono’ termasuk besaran
leksikal berupa nilai konstanta. Sedangkan hirung_luas, panjang, lebar, x,
ulang, luas_lingkaran, jejari, dan nama termasuk besaran leksikal identifier
variable.
Kompilator (compiler) adalah sebuah program yang membaca suatu program yang
ditulis dalam suatu bahasa sumber (source language) dan menterjemah-kannya ke dalam suatu
bahasa sasaran (target language).
7
• Menganalisis source code dan memecahnya menjadi bagian-bagian dasarnya.
• Menghasilkan kode level menengah dari source code input yang ada.
2. Tahap Sintesa (Back-end)
Membangun program sasaran yang diinginkan dari bentuk antara.
Keterangan :
• Analisa Leksikal (scanner)
Berfungsi memecah teks program sumber menjadi bagian-bagian kecil yang mempunyai satu
arti yang disebut token, seperti : konstanta, nama variabel, keyword, operator.
• Analisa Sintaks(parser)
8
Berfungsi mengambil program sumber (sudah dalam bentuk barisan token) dan menentukan
kedudukan masing-masing token berdasarkan aturan sintaksnya dan memeriksa kebenaran dan
urutan kemunculan token.
• Analisa Semantik
Berfungsi menentukan validitas semantiks/keberartian program sumber. Biasanya bagian ini
digabung dengan Pembangkit kode antara (intermediate code generator).
• Pembangkit Kode Antara
Berfungsi membangkitkan kode antara.
• Code generator
Berfungsi membangkitkan kode program target dalam bahasa target yang ekivalen dengan
bahasa sumber.
• Code optimation
Berfungsi mengefisienkan kode antara yang dibentuk.
• Symbol table management
Berfungsi mengelola tabel simbol selama proses kompilasi. Tabel simbol adalah struktur data
yang memuat record untuk tiap identifier dengan atribut-atribut identifier itu.
• Penangan Kesalahan (Error handler)
Berfungsi menangani kesalahan yang berlangsung selama proses kompilasi.
9
BAB 2 PERANCANGAN ANALISIS LEKSIKAL
Pada projek ini saya menggunakan bahasa pemrograman C. Bahasa C (dibuat oleh
Brian W. Kernighan dan Dennis M. Ritchie) merupakan bahasa Intermediate yang artinya
adalah bahasa tersebut bisa dikatakan sebagai High Level Language, di mana para programmer
diberikan sederetan sintaks (aturan penulisan) yang dapat dimengerti oleh manusia. Akan tetapi
bahasa C juga dapat digolongkan sebagai Low Level Language karena pada bahasa C
disediakan pula sintak dalam bentuk bahasa Assembly (di mana kita ketahui bahwa bahasa
Assembly merupakan salah satu Low Level Language).
Adapun software yang saya gunakan dalam menyelesaikan projek ini, yaitu software
Dev-C++. Salah satu software yang bisa digunakan untuk membangun sebuah program C dan
C++ yaitu Dev-C++. Salah satu kelebihan dari software ini adalah keterbukaan sumber (open
source) sehingga orang umum bisa meng-upgrade aplikasi ini serta software ini bersifat
freeware (gratis). Sehingga tidak aneh apabila software ini sangat digemari dibandingkan
software-software lain yang berbayar (biasanya lumayan mahal). Selain itu software ini juga
memungkinkan untuk menambahkan library-library yang bukan bawaan dari software ini.
Akan tetapi software ini juga memiliki kelemahan yaitu ada beberapa prosedur dan fungsi yang
ada pada software lain dihilangkan dalam Dev-C++ ini.
Pada projek ini saya menggunakan bahasa sumber untuk dianalisa yaitu bahasa
pemrograman 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 adalah bahasa pemrograman yang pertama kali di buat oleh Profesor Niklaus
Wirth, seorang anggota International Federation of Information Processing (IFIP) pada tahun
1971. Dengan mengambil nama dari matematikawan Perancis, Blaise Pascal, yang pertama
kali menciptakan mesin penghitung. Profesor Niklaus Wirth membuat bahasa Pascal ini
10
sebagai alat bantu untuk mengajarkan konsep pemrograman komputer kepada mahasiswanya.
Selain itu, Profesor Niklaus Wirth membuat Pascal juga untuk melengkapi
kekurangankekurangan bahasa pemrograman yang ada pada saat itu.
Dari awal dikembangkan, Pascal dirancang untuk keperluan akademik. Atas alasan itu
pula Pascal masih digunakan di berbagai sekolah dan universitas di seluruh dunia (termasuk
Indonesia).
Operator -, +, /, *
Identifier Variable
String Ditandai dengan ‘string’
Assignment :=
Delimineter ., ,, ;, (, ), (titik, koma, titik-koma, buka kurung, tutup
kurung)
Array start, Array end [, ](kurung siku)
Range .. (dua titik)
Number 0 sampai 9
Illegal character Contoh: {, }
Relational operator <, <=, <>, =, >, >=. IN
Compiler directive $
Unary operator @
Converter # (ASCII converter)
IV. ALGORITMA/FLOWCHART UNTUK HAPUS WHITE SPACE DAN HAPUS
11
KOMENTAR
12
II. HAPUS KOMENTAR
A. RE (REGULAR EXPRESSION)
13
• Sebuah bahasa dinyatakan regular jika terdapat finite state automata yang dapat
menerimanya.
• Bahasa-bahasa yang diterima oleh FSA bisa dinyatakan secara sederhana dengan
ekspresi regular (regular expression).
• Ekspresi regular memberikan suatu pola (pattern) atau template untuk
untai/string dari suatu bahasa.
• Banyak masalah pada perangkat lunak yang bisa disederhanakan dengan
melakukan pengubahan notasi ekspresi regular ke dalam implementasi komputer
dari FSA yang bersangkutan.
Contoh : Finite State Automata untuk mengenal bilangan bulat /integer tidak
bertanda
Ekspresi Regularnya adalah : misal 0..9 disimbolkan sebagai digit, maka, ERnya
adalah : (digit)(digit).
Regular expression atau yang sering disebut sebagai Regex adalah sebuah
formula untuk pencarian pola suatu kalimat/string (Regular,2009). Sering kali orang
beranggapan bahwa regex susah dan membingungkan. Namun sebenarnya regex
14
sangatlah membantu dalam menemukan pola-pola kalimat. Sehingga percobaan
terhadap semua kemungkinan pola kalimat tidak perlu dilakukan.
Regular expression umumnya digunakan oleh banyak pengolah kata/text editor
dan peralatan lainnya untuk mencari dan memanipulasi kalimat dengan berdasarkan
kepada suatu pola tertentu. Banyak bahasa pemrograman yang mendukung regular
expression seperti misalnya PHP, perl, VB dan Tcl. Sebuah alasan yang sangat bagus
untuk menggunakan regex adalah karena regex sangatlah powerfull. Pada level rendah
regex dapat mencari sebuah penggalan kata. Pada level tinggi regex mampu
melakukan kontrol terhadap data. Baik mencari, menghapus dan merubah.
Pola Penjelasan
[] ekspresi kurung. cocok dengan satu karakter yang berada dalam kurung,
misal: pattern "a[bcd]i" cocok dengan string "abi", "aci", dan "adi".
penggunaan range huruf dalam kurung diperbolehkan, misal : pattern
"[a-z]M cocok dengan salah satu karakter diantara string "a" sampai "z".
pattern [0-9] cocok dengan salah satu angka. jika ingin mencari karakter
juga, karakter tersebut harus diletakkan di depan atau di belakang
kelompok, misal: "[abc-]".
[^ ] cocok dengan sebuah karakter yang tidak ada dalam kurung, berlawanan
dengan yang diatas. misal: pattern "[^abc]" cocok dengan satu karakter
apa saja kecuali "a", "b", "c".
? cocok dengan nol atau satu karakter sebelumnya. misal: pattern "died?"
cocok dengan string "die" dan "died".
+ cocok dengan satu atau lebih karakter sebelumnya. misal: "yu+k" cocok
dengan "yuk", "yuuk", "yuuuk", dan seterusnya.
* cocok dengan nol atau lebih karakter sebelumnya. misal: pattern "hu*p"
cocok dengan string "hp", "hup", "huup" dan seterusnya.
15
{x} cocok dengan karakter sebelumnya sejumlah x karakter. misal: pattern
"[0- 9] {3}" cocok dengan bilangan berapa saja yang berukuran 3 digit.
^ jika diletakkan di depan pattern, akan cocok dengan awal sebuah string.
Contoh : L = { a, b }
1. a|b ekspresi regular untuk { a, b }
2. (a|b)(a|b) → { aa, ab, ba, bb }
3. a* ekspresi regular untuk { e, a, aa, aaa, ... }
4. (a|b)* ekspresi regular untuk himpunan semua string yang memuat nol atau
lebih a atau b.
5. a|a+b ekspresi regular untuk himpunan yang memuat a dan semua string
memuat nol atau lebih diikuti oleh b.
16
Jika r dan s menyatakan bahasa yang sama, dikatakan r dan s ekivalen dan
ditulis r = s.
Contoh : (a|b) = (b|a)
Contoh RE lain:
Berdasarkan program yang telah dibuat, maka beberapa RE dari token yang
ditentukan adalah sebagai berikut:
Delimeter Comment
[\^$.|?(),;:] RE //.... : //(.*?)
White Space RE {...} : \{(.*?)\}
[ \t\r\n\f] RE (*...*) : \(\*(.*?)\*\)
Relational Operator String
([<>=]|[<>]=|like) [a-zA-Z0-9_]
number dan operator Number
([-+]?[0-9]*\.?[0-9]+[\/\+\-\*])+([-+]?[0-9]*\.?[0-9]+) [0-9]
Finite state automata adalah mesin abstrak berupa sistem model matematika
dengan masukan dan keluaran diskrit yang dapat mengenali bahasa paling
sederhana (bahasa reguler) dan dapat diimplementasikan secara nyata.
17
Finite State Automata (FSA) adalah model matematika yang dapat
menerima input dan mengeluarkan output yang memiliki state yang berhingga
banyaknya dan dapat berpindah dari satu state ke state lainnya berdasarkan input
dan fungsi transisi. Finite state automata tidak memiliki tempat
penyimpanan/memory, hanya bisa mengingat state terkini.
18
Finite State Automata bekerja dengan cara mesin membaca memori
masukan berupa tape yaitu 1 karakter tiap saat (dari kiri ke kanan) menggunakan
head baca yang dikendalikan oleh kotak kendali state berhingga dimana pada mesin
terdapat sejumlah state berhingga.
Finite Automata selalu dalam kondisi yang disebut state awal (initial state)
pada saat Finite Automata mulai membaca tape. Perubahan state terjadi pada mesin
ketika sebuah karakter berikutnya dibaca. Ketika head telah sampai pada akhir tape
dan kondisi yang ditemui adalah state akhir, maka string yang terdapat pada tape
dikatakan diterima Finite Automata (String-string merupakan milik bahasa bila
diterima Finite Automata bahasa tersebut).
19
Label di anak panah menyatakan simbol yang membuat transisi dari 1 state
ke state lain. 1 anak panah diberi label start untuk menyatakan awal mula
transisi dilakukan.
atau δ(Genap,0) =
Genap δ(Genap,1) =
Ganjil δ(Ganjil,0) =
Ganjil δ(Ganjil,1) =
Genap
20
Sebuah FSA dibentuk dari lingkaran yang menyatakan state:
• Label pada lingkaran adalah nama state
• Busur menyatakan transisi/ perpindahan
• Label pada busur yaitu symbol input
• Lingkaran yang didahului sebuah busur tanpa label menyatakan state awal
• Lingkaranb ganda menyatakan state akhir/ final. Jadi sebuah mesin
otomata dapat dinyatakan dalam diagram transisi, fungsi transisi dan tabel
transisi.
Jenis FSA
Ada dua jenis FSA :
1. Deterministic Finite Automata (DFA)
Dari suatu state ada tepat satu state berikutnya untuk setiap simbol masukan
yang diterima. Deterministik artinya tertentu/sudah tertentu fungsi transisinya.
Notasi matematis DFA:
• M = nama DFA
• Q = himpunan keadaan DFA
• S = himpunan alfabet
• d = fungsi transisi
• q0 = keadaan awal
• F = keadaan akhir
M = (Q, S, d, q0, F)
21
DFA nya:
Q = {q0 , q1 , q2 , q3 }
Σ = {0,1} S = q0 F =
{ q0} fungsi transisi
adalah:
22
Kedua finite automata di atas mampu mengenali himpunan reguler secara presisi.
Dengan demikian kedua finite automata itu dapat mengenali string-string yang
ditunjukkan dengan ekspresi reguler secara tepat.
23
BAB 3 SCREEN SHOT OUTPUT PROGRAM
• Saat program pertama kali di run. Akan tampil seperti gambar dibawah ini:
• Lalu input nama file (.pas) yang ingin di analisa. File (.pas) harap letak dalam satu folder
yang sama.
• Setelah kita input, akan muncul tampilan berupa keterangan dan source code dari file
(.pas) yang kita input-kan tadi.
24
• Hasil analisa token dan penghapusan white space akan tampil dalam file (.txt) dengan
nama file File_Token.txt dan whitespace.txt yang otomatis langsung masuk ke dalam
folder.
25
• Tampilan isi file whitespace.txt:
26
BAB 4 KESIMPULAN
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
27
typedef struct tokentag{
char nm[20];
} token; //array dari 0 token tipe[] = {"keyword","identifier",
"operator","relational operator", "number", "string", "illegal
character","assignment","array","delimineter", "range","compiler
directive", "converter", "Unary operator"};
28
} ttyp;
main(){
long i, j, ind, zz, N, NN, ln; char ch, nxt,
instr[1024], tmp[100], FName[256]; ttyp
Token[1024]; FILE *f ,*f4; char c;
printf("Masukkan Nama File Source code: ");
scanf("%s", FName); f = fopen(FName,"r");
ln = 0;
NN = 0;
while (!feof(f)){
N = 0; ch =
0;
29
instr[N] = 0;
N++;
if ( ind < N ) // if whole line has spaces, wil not be gone in.
{
// first 'operator' control will be done.
j = 0; while( (j < jlhOp) && (ch !=
oprtr[j]) ) j++;
if ( ch == oprtr[j] ) // so ch is an operant.
{ zz
= 0; tmp[0] = ch;
if ( ind < N ) nxt =
instr[ind + 1];
30
Token[NN].typ = 3; // relational operator
}
else if ( (ch == '.')
&& (nxt == '.'))
{
zz++;
tmp[1] = nxt;
ind +=2;
Token[NN].typ = 10; // range
}
else
ind++;
switch (ch)
{
case ':': if (nxt == '=')
Token[NN].typ = 7; else
Token[NN].typ = 9; //deli
break;
case '+':
case '-':
case '*':
case '/':
Token[NN].typ = 2;
break; // operator
case '.':
Token[NN].typ = 9;
break;
case ';':
31
Token[NN].typ = 9;
break; // deli
case ',':
Token[NN].typ = 9;
break;
case '=':
case '>':
case '<':
Token[NN].typ = 3;
break; // relational oparator
case '[':
Token[NN].typ = 8;
break; // array start
case ']':
Token[NN].typ = 8;
break; // array end
case '(':
case ')':
Token[NN].typ = 9;
break;
case '$':
Token[NN].typ = 11;
break; // compiler directive
case '#':
Token[NN].typ = 12;
break; // ASCII converter
32
case '@':
Token[NN].typ = 13;
break; // unary operator
}
zz++;
tmp[zz] = 0; Token[NN].no =
NN; strcpy(Token[NN].ctkn,
tmp);
Token[NN].lline = ln;
NN++;
}
tmp[zz] = 0;
Token[NN].no = NN;
strcpy(Token[NN].ctkn, tmp);
Token[NN].typ = 5;
Token[NN].lline = ln;
NN++; ind++;
33
}
else if ( ((ch >= 65) && (ch <= 90)) || ((ch >= 97) &&
(ch <= 122)) || (ch == 95) )
// if ch is A..Z or a..z or '_' it is identifier or reserved word
{ zz
= 0; tmp[0] = ch;
nxt = instr[ind + 1];
zz++;
while ( ((nxt >= 65) && (nxt <= 90)) || ((nxt >= 97) &&
(nxt <= 122)) || (nxt == 95) || ((nxt >= 48) && (nxt <= 57)) )
// A..Z arasy, a..z arasy, '_', 0..9 arasy
{
ind++; ch =
instr[ind]; tmp[zz]
= ch; zz++;
nxt = instr[ind + 1]; }
tmp[zz] = 0;
if ( isReserved(tmp) == 0)
Token[NN].typ = 0; // keyword = reserved
else
Token[NN].typ = 1; // identifier
Token[NN].no = NN; strcpy(Token[NN].ctkn,
tmp);
Token[NN].lline = ln;
NN++; ind++;
34
else if ( (ch >= 48) && (ch <= 57) ) // 0..9 : 'number'
{ zz
= 0; tmp[0] = ch;
nxt = instr[ind + 1];
zz++;
while ( ((nxt >= 48) && (nxt <= 57)) ) // take all 0..9 numbers.
{
ind++; ch =
instr[ind]; tmp[zz]
= ch; zz++;
nxt = instr[ind + 1];
}
tmp[zz] = 0;
Token[NN].typ = 4; // number
Token[NN].no = NN;
strcpy(Token[NN].ctkn, tmp);
Token[NN].lline = ln;
NN++; ind++;
}
else // illegal charater
{
Token[NN].no = NN;
Token[NN].ctkn[0] = ch;
Token[NN].ctkn[1] = 0;
Token[NN].typ = 6;
Token[NN].lline = ln;
NN++; ind++;
}
}//if
35
} // while ln++; // increase
line number by one
} // while
36
}
}
} cout<<"temp :
"<<temp[9]<<endl; fclose(f1);
fclose(f4);
*/
//tampil
fclose(f); printf("\n"); printf("---------------------------------------------------
-------------"); printf("\n"); printf("Untuk Token silahkan buka
File_Token.txt"); printf("\n"); printf("-----------------------------------------------
-----------------"); printf("\n"); printf("Untuk Hasil Penghapusan Whitespace
silahkan buka whitespace.txt"); printf("\n"); f = fopen(FName,"r");
printf("----------------------------------------------------------------");
printf("\n");
printf("Souce Program
Inputan:"); printf("\n");
printf("\n"); while((c=getc(f))!=EOF)
{
printf("%c",c);
}
fclose(f);
printf("\n");
system("pause");
for(i=0;i<NN;i++)
{
fprintf(f, "| %4ld |%4ld |%10s |%20s |\n",
37
Token[i].no, Token[i].lline, Token[i].ctkn, tipe[Token[i].typ].nm);
fprintf(f, "--------------------------------------------------------------\n"); }
fclose(f);
}
program bintang_dalam_bintang;
uses crt; var a, i,j:integer; begin
write('masukan bilangan: ');
readln(a); for i:=1 to (a+(a-1))
do begin for j:=1 to
(a+(a-1)) do
writeln;
end;
readln;
end.
DAFTAR PUSTAKA
https://pakhartono.files.wordpress.com/2010/04/analisis-leksikal.pdf
http://ichaaa3.blogspot.co.id/2013/01/analisis-leksikal.html
http://semutuyet.blogspot.co.id/2012/11/makalah-tehnik-kompilasi.html
http://anotherlocalhero.blogspot.co.id/2013/12/program-scanner-untuk-melakukan.html
https://s3.amazonaws.com/ed.edim.co/18494218/bab_i_pendahuluan_c_dan_c.pdf?responseconte
ntdisposition=filename%3D%22bab_i_pendahuluan_c_dan_c.pdf%22%3B%20filename%
38
2A%3DUTF8%27%27bab_i_pendahuluan_c_dan_c.pdf&AWSAccessKeyId=AKIAJXGLFWC
DC7HTECXQ&Expires=1459147868&Signature=lGW%2F970xlCdDk6H8Zu6ivi7YHF8%3D
https://id.wikipedia.org/wiki/Pascal_(bahasa_pemrograman) http://www.duniailkom.com/tutorial-
belajar-pascal-jenis-jenis-operator-dalam-bahasapemrograman-pascal/
https://kangrandypranarelza.wordpress.com/2012/01/11/lexical-analysis-in-compiler-design/
http://pelita-informatika.com/berkas/jurnal/1.%20jurnal%20Sinar%20sinurat.pdf
http://ojs.unud.ac.id/index.php/jik/article/viewFile/2677/1891
http://documents.tips/documents/makalahtekomnimas.html http://ruby-doc.org/core-
2.1.1/Regexp.html http://stackoverflow.com/questions/14660878/regular-expression-for-
comments-in-pascal http://www.allinterview.com/showanswers/73305/write-program-remove-c-
comments-and-fromfile-should-be-declared-command-line.html
http://dhiaheka.blogspot.co.id/2013/05/regular-expressionregex-pada-c_2196.html
https://riskasimaremare.wordpress.com/2013/04/23/finite-state-automata/
39