İşleç Düzey Yön ^ Yüksek Sağdan sola ( ) * Orta Soldan sağa ( ) + Alçak Soldan sağa ( )

Benzer belgeler
Gramer Tabanlı Değerlendirme Yöntemleri

ÖDEV (Vize Dönemi) CEVAPLAR. 1. Ekrana Merhaba Dünya! yazdıran algoritmanın akış diyagramını çiziniz ve sözde kod olarak yazınız.

Programlama Dilleri. C Dili. Programlama Dilleri-ders02/ 1

Lambda İfadeleri (Lambda Expressions)

Semantik (Semantics): ifadelerin, deyimlerin, ve program birimlerinin anlamı Sentaks ve semantik bir dilin tanımı sağlar

Görsel Programlama DERS 03. Görsel Programlama - Ders03/ 1

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

Sınav tarihi : Süre : 60 dak. a) ABCDE b) BCDE c) ABCD d) kod hatalı e) BCD

2 ALGORİTMA VE AKIŞ DİYAGRAMLARI

EBG101 PROGRAMLAMA TEMELLERİ VE ALGORİTMA

Doğu Akdeniz Üniversitesi Bilgisayar Mühendisliği Bölümü. BLGM 318 Ara Sınavı Đlkbahar Dönemi 13 Nisan Ad, Soyad Öğrenci No.

C Programlama Dilininin Basit Yapıları

Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : dak.

Sunum İçeriği. Programlamaya Giriş

C# Yazım Kuralları ERCİYES. Ü. BİLGİSAYAR M. COMPUTER PROGRAMMING II 1 FEHİM KÖYLÜ

Kodlanacak programlama dilinin kaynaklarından faydalanılarak kod yazımı yapılır.

Algoritma ve Akış Diyagramları

Kodlanacak programlama dilinin kaynaklarından faydalanılarak kod yazımı yapılır.

Nesne Yönelimli Programlama

Çoktan Seçmeli Değerlendirme Soruları Akış Şemaları İle Algoritma Geliştirme Örnekleri Giriş 39 1.Gündelik Hayattan Algoritma Örnekleri 39 2.Say

Bil101 Bilgisayar Yazılımı I. M. Erdem ÇORAPÇIOĞLU Bilgisayar Yüksek Mühendisi

PROGRAMLAMAYA GİRİŞ VE ALGORİTMA «YTÜROK» EĞİTMEN:REHA ÖZGÜR ŞİMŞEK

Algoritma ve Programlamaya Giriş

3/7/2011. ENF-102 Jeoloji 1. Tekrar -- Değişken Tanımlamaları (Definition) ve Veri Türleri (Data Type) Veri Tanımları ve Mantıksal Đşlemler

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 2

BIL1202 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ

PASCAL PROGRAMLAMA DİLİ YAPISI

Örnek 4: Örnek Özyinelemeli fonksiyon örneği Bölüm 9. C++ programlama dilinde Nesne ve sınıf

BMT 101 Algoritma ve Programlama I 6. Hafta. Yük. Müh. Köksal Gündoğdu 1

Algoritma ve Akış Diyagramları

Algoritma Geliştirme ve Veri Yapıları 9 Ağaç Veri Modeli ve Uygulaması. Mustafa Kemal Üniversitesi

Nesne Tabanlı Programlama

Sınav tarihi : Süre : 60 dak. a) strstr b) strchr c) strcat d) strcpy e) strlen. a) b) d) e) 0

enum bolumler{elektronik, insaat, bilgisayar, makine, gida};

Günümüz bilgi toplumunda bilgisayar, her alanda kendine yer edinmiş ve insana, bir çok işlemde yardımcı olarak büyük kolaylık sağlamaktadır.

-A Grubu- MKT103 Görsel Programlama 2015/2016 Güz Dönemi Final Sınavı

Dr. Fatih AY Tel: fatihay@fatihay.net

Değişkenler. Geçerli değişken isimleri : baslamazamani, ad_soyad, x5 Geçersiz değişken isimleri : 3x, while

Yrd. Doç. Dr. Caner ÖZCAN

C++ Operatörler (Operators)

Programlama Dillerinde Kullanılan Veri Tipleri

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Yrd. Doç. Dr. A. Burak İNNER Bilgisayar Mühendisliği

BBS515 Nesneye Yönelik Programlama. Ders 2 Zümra Kavafoğlu

Veri Yapıları ve Algoritmalar

/ C Bilgisayar Programlama Final Sınavı Test Soruları. Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : , 60 dak.

Internet Programming II. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı

J A V A D A P R O G R A M D E N E T İ M İ V E O P E R A T Ö R L E R

PROGRAMLAMAYA GİRİŞ DERS 2

BM202 SAYISAL ÇÖZÜMLEME

HSancak Nesne Tabanlı Programlama I Ders Notları

Öğr. Gör. Serkan AKSU 1

YAZILI SINAV SORU ÖRNEKLERİ MATEMATİK

BİL-142 Bilgisayar Programlama II

Java String İşlemleri

Tokenlarin Taninmasi

Syntax Analysis. 4/5/2004 Formal Diller 4.1

5.HAFTA. Sınıf ve Nesne Kavramı, Metot Oluşturma, Kurucu Metot, this Deyimi

BMT 101 Algoritma ve Programlama I 11. Hafta. Yük. Müh. Köksal Gündoğdu 1

BİLGİSAYAR PROGRAMLAMA MATLAB

1. PROGRAMLAMAYA GİRİŞ

Eastern Mediterranean University Faculty of Arts & Sciences -- Department Of Mathematics BİLG213 BİLGİSAYAR PROGRAMLAMAYA GİRİŞ

BLM 111 ALGORİTMA VE PROGRAMLAMA I

Pythonda değişkenlerin türlerini tanımlamaya gerek yoktur

/ C Bilgisayar Programlama Yıliçi Sınavı Test Soruları. Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : , 60 dak.

11- FONKSİYONLAR (FUNCTIONS)

Dr. Fatih AY Tel:

ESM-361 Mikroişlemciler. 3. Hafta Ders Öğretim Üyesi Dr.Öğr.Üyesi Ayşe DEMİRHAN

BMT 101 Algoritma ve Programlama I 7. Hafta. Yük. Müh. Köksal Gündoğdu 1

Genel Programlama I

BM102 BİLGİSAYAR PROGRAMLAMA II LABORATUVAR UYGULAMALARI. 3Hafta

İÇERİK PROGRAMLAMAYA GİRİŞ ALGORİTMA AKIŞ DİYAGRAMLARI PROGRAMLAMA DİLLERİ JAVA DİLİNİN YAPISI JAVA DA KULLANILAN VERİ TİPLERİ JAVA DA PROGRAM YAZMA

Hafta 13 Fonksiyonlar

Arasınav Örnek Soruları Bahar 2018

HSancak Nesne Tabanlı Programlama I Ders Notları

/*Aşağıda ki kodları doğru şekilde anlar ve kullanırsanız java da sınıfları biraz da olsa anlamış olursunuz.*/

Nesne Yönelimli Programlama

Java da İşleçler, Ders #3 (4 Kasım 2009)

BİLGİSAYAR PROGRAMLAMA. Algoritma ve Akış Şemaları

İçerik. Java da İşleçler, İşleçler. Aritmetik İşleçler - 1. Aritmetik İşleçler - 2. Geçen ders: Bu ders: BS-515 Nesneye Yönelik Programlama

Kocaeli Üniversitesi C Bilgisayar Programlama Ara Sınavı Test Soruları

B02.6 Karar Verme, Eşitlik ve Bağıntı Operatörleri

BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜM BAŞKANLIĞI DERS TANITIM BİLGİLERİ

ALGORİTMA VE PROGRAMLAMA I

JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ

YZM 2116 Veri Yapıları

SAYILAR DOĞAL VE TAM SAYILAR

Java da Program Denetimi ve Operatörler

Yrd. Doç. Dr. Caner ÖZCAN

Nesne Tabanlı Programlama

HSancak Nesne Tabanlı Programlama I Ders Notları

LYS MATEMATİK DENEME - 1

BLM-112 PROGRAMLAMA DİLLERİ II. Ders-1 Kapsama Kuralları & Rasgele Sayı Üretimi & Rekürsif (Özyinelemeli) Fonksiyonlar

YZM Biçimsel Diller ve Otomata Teorisi. Ders#06

ELN1001 BİLGİSAYAR PROGRAMLAMA I

BMÜ-111 ALGORİTMA VE PROGRAMLAMA AKIŞ KONTROLÜ YRD. DOÇ. DR. İLHAN AYDIN

BBS515 Nesneye Yönelik Programlama. Ders 3 Zümra Kavafoğlu

NESNE TABANLI PROGRAMLAMA-1 DERS UYGULAMALARI (22 EYLÜL - 14 KASIM

Transkript:

Mühendislik Fakültesi 2008-2009 Güz Yarıyılı Derleyici Tasarımı 1. Arasınav Soruları 14 Kasım 2008 Cuma Aşağıda toplama (+), çıkarma (*) ve üs alma (^) işleçlerini içeren aritmetik ifadeler için gramer kuralları ile bu işleçlerin öncelik düzeyleri ve birleşme yönleri verilmiştir. E E "+" E E E "*" E E E "^" E E "(" E ")" E id num (AddExp) (MulExp) (PowExp) (ParExp) (Id, Num) İşleç Düzey Yön ^ Yüksek Sağdan sola ( ) * Orta Soldan sağa ( ) + Alçak Soldan sağa ( ) Burada E simgesi bir sonsuz veriyi (nonterminal), çift tırnak içindeki simgeler de sonlu verileri (terminals, tokens) göstermektedir. Her bir üretim kuralının temsil edileceği sözdizim sınıfı (syntax class) parantez içinde verilmiştir. a) Bu gramer tarafından üretilen, ancak parantez simgelerini içermeyen bütün mümkün aritmetik ifadeleri için bir düzenli ifade (regular expression) yazınız. İfade içinde id ve num kelimelerini kullanabilirsiniz. Birkaç mümkün aritmetik ifade aşağıda verilmiştir. (10p) id+id*num^id num^id*num*id+id id^id^num*num+id b) Gramerde bulunan sonlu kelimelerin (terminals, tokens) JavaCC notasyonunda tanımlamasını yapınız. (5p) c) Bu gramer ile "a*(b+c)^d" ifadesinin soldan sağa doğru türetimini (leftmost derivation) gösteriniz ve ayrıştırma ağacını (parse tree) oluşturunuz. (10p) d) Gramerin belirsiz yada çok anlamlı (ambiguous) olup olmadığını açıklayınız, varsa belirsizliği düzelterek grameri yeniden yazınız. (10p) e) Yeni gramer için FIRST ve FOLLOW kümelerini (sets) hesaplayınız. (10p) f) Yeni gramer için ayrıştırma tablosunu (parsing table) oluşturunuz ve gramerin bir LL(1) olup olmadığını belirleyiniz. (10p) g) Yeni gramerde olması muhtemel soldan özçağrı (left-recursion) içeren ifadeleri ortadan kaldıracak şekilde üretim kurallarını yeniden düzenleyiniz. (10p) h) Yeni gramerin JavaCC notasyonunda tanımlamasını yapınız. (5p) i) Gramere ait sözdizim sınıflarından (syntax classes) PowExp ve ParExp sınıflarını nesneye dayalı bir dilde yazınız. Bir Exp soyut sınıfının tanımlandığını varsayınız. (10p) public abstract class Exp { public class PowExp extends Exp {... public class ParExp extends Exp {... j) "2*(3+4)^5" ifadesi için sözdizim ağacını (syntax tree) sözdizim sınıflarını kullanarak oluşturunuz. (10p) Exp exp = new... k) Bu gramer ile üretilen ifadeleri değerlendirecek bir eval metodu tanımlayınız. (10p) int eval(exp e) {... Sınav süresi 120 dakikadır. BAŞARILAR.

Mühendislik Fakültesi 2008-2009 Güz Yarıyılı Derleyici Tasarımı Final Sınavı Soruları 26 Ocak 2008 Pazartesi 1. Derleyiciler kaynak kodu arakod dönüşümünden sonra temel bloklarına neden ayırırlar? Kısaca açıklayınız. (10p) 2. Aşağıda verilen C kodu için bir CFG (bağlam ilintisiz gramer) yazınız. (20p) int t = 0; while (n > 0) { t += n % 10; n /= 10; 3. Yukarıdaki kod için bir kelimesel çözümleyicinin (scanner) üreteceği token ları belirleyiniz. (10p) 4. Her bir gramer kuralı için birer sözdizim sınıfı (syntax classes) belirleyerek yukarıdaki kodun sözdizim ağacını nesneye dayalı bir dilde yazınız. Sözdizim dizim sınıflarını sadece isimlendiriniz, tanımlamayınız. (20p) 5. Kodu if/goto ifadeleri ile yeniden yazınız. (10p) 6. Tree dili işlev ve değişmezlerini kullanarak yeni kodun ara kod dönüşümünü yapınız. (20p) 7. Ara kodu temel bloklarına ayırınız. (10p) Sınav süresi 120 dakikadır. BAŞARILAR. abstract class Exp CONST(int value) NAME(Label label) TEMP(Temp.Temp temp) BINOP(int binop, Exp left, Exp right) MEM(Exp exp) CALL(Exp func, ExpList args) ESEQ(Stm stm, Exp exp) ExpList(Exp head, ExpList tail) Tree dili işlev ve değişmezleri abstract class Stm MOVE(Exp dst, Exp src) EXP(Exp exp) JUMP(Exp exp, Temp.LabelList targets) CJUMP(int relop, Exp left, Exp right, Label iftrue, Label iffalse) SEQ(Stm left, Stm right) LABEL(Label label) StmList(Stm head, StmList tail) final static int BINOP.PLUS, BINOP.MINUS, BINOP.MUL, BINOP.DIV, BINOP.AND, BINOP.OR, BINOP.LSHIFT, BINOP.RSHIFT, BINOP.ARSHIFT, BINOP.XOR; final static int CJUMP.EQ, CJUMP.NE, CJUMP.LT, CJUMP.GT, CJUMP.LE, CJUMP.GE, CJUMP.ULT, CJUMP.ULE, CJUMP.UGT, CJUMP.UGE;

2009-2010 Bahar Yarıyılı Derleyici Tasarımı 1. Ara Sınavı Tarih: 8 Kasım 2009 Pazar Sınav süresince cep telefonları kapalı tutulmalı ve sıranın üzerine bırakılmamalıdır. 1. Derleyicilerin sözdizim analizi aşamasında oluşturdukları soyut sözdizim ağaçlarının (abstract syntax tree) sonraki aşamalar açısından önemini ve kullanım alanlarını açıklayınız. (15p) 2. 4 ile tam bölünebilen bütün ikili (iki tabanındaki) sayılar için bir L dili tanımlanıyor. Örneğin, 000, 0000, 100 ve 10100 sayılarının her biri L dilinin bir kelimesidir. Bu dildeki bütün kelimeleri üretebilen bir düzenli ifade (regular expression), bir DFA (deterministic finite automata) ve bir CFG (context-free grammar) oluşturunuz. (25p) 3. Aşağıdaki gramerin niçin LL(1) olmadığını açıklayınız ve eşdeğeri olan bir LL(1) grameri tanımlayınız. (30p) S X X Y Y a X Y b Z Z Z b Z c ε 4. Aşağıda verilen gramerdeki token sınıflarını belirleyiniz ve S kuralı için C++ yada Java dilinde bir parser yazınız. Token ların gettoken() fonksiyonu ile alınabildiğini varsayınız. (30p) S if C then S ; while C do S ; id = num id ++ C id == num id > num

2009-2010 Güz Yarıyılı Derleyici Tasarımı Dönem Sonu Sınavı Tarih: 15 Ocak 2010 Cuma Süre: 100 dakika 1. Arakod dönüşümünün önemini açıklayınız. Aşağıdaki kod parçasını Tree dilinde yazınız. (25p) int s=0; do { s++; while ((n /= 2) > 0); 2. Derleme süreçlerinde sembol tabloları niçin kullanılır? Sembol tabloları hangi durumlarda programların EXE koduna eklenir? Aşağıdaki kodun sembol tablosunu oluşturunuz. (25p) class A { int a; int m(int x) { a = a x; if (a > 0) return n(a-2); return a; int n(int x) { a = 2*a - x; if (a < 100) m(a-5); return a; 3. Bir kodun aktivasyon kayıtlarının yönetimi nasıl gerçekleştirilir? Aşağıdaki koda ait aktivasyon kayıtlarının bellek görüntülerini çiziniz. (25p) int f(int a[]) { int x = a[0]; for (int i=1; i<x.length; i++) if (a[i] > x) x = a[i]; return x; 4. En az 2 nonterminal ile CFG notasyonunda bir dil tanımlaması yapınız. Bu dil için sözdizim sınıflarını ve sözdizim ağacını girdi verisi olarak kullanan (yani, bu veri ile herhangi bir hesaplama yapan) bir yorumlayıcı yazınız. (25p) abstract class Exp CONST(int value) NAME(Label label) TEMP(Temp.Temp temp) BINOP(int binop, Exp left, Exp right) MEM(Exp exp) CALL(Exp func, ExpList args) ESEQ(Stm stm, Exp exp) ExpList(Exp head, ExpList tail) Tree dili işlev ve değişmezleri abstract class Stm MOVE(Exp dst, Exp src) EXP(Exp exp) JUMP(Exp exp, Temp.LabelList targets) CJUMP(int relop, Exp left, Exp right, Label iftrue, Label iffalse) SEQ(Stm left, Stm right) LABEL(Label label) StmList(Stm head, StmList tail) final static int BINOP.PLUS, BINOP.MINUS, BINOP.MUL, BINOP.DIV, BINOP.AND, BINOP.OR, BINOP.LSHIFT, BINOP.RSHIFT, BINOP.ARSHIFT, BINOP.XOR; final static int CJUMP.EQ, CJUMP.NE, CJUMP.LT, CJUMP.GT, CJUMP.LE, CJUMP.GE, CJUMP.ULT, CJUMP.ULE, CJUMP.UGT, CJUMP.UGE;

2010-2011 Güz Yarıyılı Derleyici Tasarımı 1. Ara Sınavı Tarih: 8 Kasım 2010 Pazartesi Süre: 100 dakika 1. Bir programlama dilinde operatör (işleç) önceliklerinin ve birleşme yönlerinin gramer yazımına etkisini açıklayınız. Öncelik düzeyleri ve birleşme yönleri farklı olan iki C operatörünü içeren ifadeleri üretebilen bir gramer yazınız. Grameri yazarken söz konusu iki operatör ile birlikte id ve num token larını kullanabilirsiniz. (25p) 2. C dilinde yazılan fonksiyonların tanımlama başlıklarını üretebilen bir LL(1) grameri yazınız. Fonksiyon tanımlamalarının temel türleri ve formal parametreleri herhangi bir sıra ve sayıda içerebildiğine dikkat ediniz. Aşağıda bazı fonksiyonların tanımlama başlıkları örnek olarak verilmiştir. (25p) void f0 (); int g2 (int a, char c2); double seta (short s, float s0, int k); 3. Soru 2 de belirtilen gramer için JavaCC de bir token üretici (scanner) tanımlayınız. (25p) 4. Aşağıda iki tabanındaki bütün sayıları üretebilen bir CFG grameri ve gramerin her bir kuralı için sözdizim sınıflarının (syntax classes) isimleri verilmiştir. Bu sınıfların tanımlamalarını C++ yada Java dilinde veriniz ve 1011 ikili sayısı için sözdizim ağacını (syntax tree) tanımladığınız sınıflar yardımıyla oluşturunuz. (25p) B D B (Bin) B ε (End) D 0 1 (Bit)

2010-2011 Güz Yarıyılı Derleyici Tasarımı Final Sınavı Tarih: 10 Ocak 2011 Pazartesi 1. Tamsayılar ve x değişkeni üzerinde toplama, çarpma ve faktöriyel alma işlemlerinin tanımlanabildiği matematiksel ifadeleri üretebilen bir gramer ve sözdizim (syntax) sınıfları aşağıdaki tabloda veriliyor. Token'ların çift tırnak içerisinde gösterildiğine dikkat ediniz. Gramer kuralları E E "+" E E E "*" E E "(" E ")" E "(" E ")" "!" E "x" E ["0"-"9"]+ Sözdizim sınıfları (Plus) (Times) (Paren) (Fact) (Var) (Num) Bu gramer ve sınıflara göre aşağıdaki soruları cevaplayınız. (80p) a) Bu gramer aşağıda verilen üç ifadeden hangilerini üretebilir? (10p) 32*x+5!*x x*x+(x+21)*(x+2)! x+((x*3)!+x+2)! b) Grameri LL(1) gramerine dönüştürünüz. (10p) c) Paren ve Fact kurallarını javacc'de tanımlayınız. (10p) d) Fact sınıfını tanımlayınız. (10p) e) Sözdizim ağacının Paren ve Fact düğümlerini üretecek şekilde javacc tanımlamalarına nesne üretim ifadeleri (semantic actions) ekleyiniz. (10p) f) Paren ve Fact düğümlerini değerlendiren visit() metotlarını tanımlayınız. (10p) g) Aşağıdaki ifade için soyut sözdizim ağacını (abstract syntax tree) bir nesne biçiminde oluşturunuz. (10p) x+5*(x+2)! h) g) de verilen ifadeyi Tree diline dönüştürünüz. (10p) 2. Değişkenlerin canlılık analizi (liveness analysis) niçin yapılır? Uygun kod blokları oluşturarak kısaca açıklayınız ve nasıl yapıldığını gösteriniz. (20p) abstract class Exp CONST(int value) NAME(Label label) TEMP(Temp.Temp temp) BINOP(int binop, Exp left, Exp right) MEM(Exp exp) CALL(Exp func, ExpList args) ESEQ(Stm stm, Exp exp) ExpList(Exp head, ExpList tail) Tree dili işlev ve değişmezleri abstract class Stm MOVE(Exp dst, Exp src) EXP(Exp exp) JUMP(Exp exp, Temp.LabelList targets) CJUMP(int relop, Exp left, Exp right, Label iftrue, Label iffalse) SEQ(Stm left, Stm right) LABEL(Label label) StmList(Stm head, StmList tail) final static int BINOP.PLUS, BINOP.MINUS, BINOP.MUL, BINOP.DIV, BINOP.AND, BINOP.OR, BINOP.LSHIFT, BINOP.RSHIFT, BINOP.ARSHIFT, BINOP.XOR; final static int CJUMP.EQ, CJUMP.NE, CJUMP.LT, CJUMP.GT, CJUMP.LE, CJUMP.GE, CJUMP.ULT, CJUMP.ULE, CJUMP.UGT, CJUMP.UGE; Canlılık hesaplama algoritması:

2011-2012 Güz Yarıyılı Derleyici Tasarımı 1. Ara Sınavı Tarih: 18 Kasım 2011 Cuma 1. Derleyicilerin kaynak verinin analizi ile ilgilenen aşamalarının görevlerini kısaca açıklayınız. Bir C dili derleyicisinde bu aşamaların aşağıda verilen kaynak kod için hangi tür hataları göstereceğini belirleyiniz (x++ ifadesindeki işlecin ++x ifadesindeki işleçten daha yüksek önceliğe sahip olduğuna dikkat ediniz). (20p) int a, b=10; if (b=10) a:=2+++b%3.0; 2. Aşağıda postfix notasyonunda yazılan aritmetik ifadeler için bir CFG grameri tanımlanmıştır. Bu grameri LL(1) gramerine dönüştürünüz ve yeni gramerin ayrıştırma tablosunu (parsing table) FIRST/FOLLOW setleri yardımıyla oluşturunuz. (30p) E E E "+" E E E "-" E E E "*" E E E "/" E id num 3. Haskell programlama dilinin desteklediği aritmetik dizi üretim ifadelerini girdi verisi (kaynak veri) olarak alan ve değerlendiren bir yorumlayıcı yazılmak isteniyor. Aşağıda verilen örnekler üzerinden aritmetik dizi üretim ifadelerinin çeşitleri ve değerlendirme sonuçları gösterilmiştir. Girdi verisi Çıktı verisi (değerlendirme sonucu) [2..] [2,3,4,5,6,7,8,9,10,11, biçiminde devam eder. [2..13] [2,3,4,5,6,7,8,9,10,11,12,13] [3,5..] [3,5,7,9,11,13,15,17,19, biçiminde devam eder. [3,7..25] [3,7,11,15,19,23] a) Bu çeşit ifadeler üretebilen bir LL(1) grameri yazınız. (10p) b) Gramere ait sözdizim sınıflarını accept() metotlarını da ekleyerek nesneye dayalı bir dilde yazınız. (10p) c) İfadelerin sözdizim analizini yapabilecek bir ayrıştırıcıyı (parser) JavaCC notasyonunda tanımlayınız ve bu tanımlamaya sözdizim ağacı (syntax tree) üretebilen ifadeler ekleyiniz. (15p) d) "[2,5..30]" ifadesi için sözdizim ağacını (b)'de tanımladığınız sözdizim sınıflarını kullanarak oluşturunuz. (5p) e) İfadeleri sözdizim ağacı üzerinden değerlendirebilecek bir yorumlayıcıyı Visitor tasarım desenini kullanarak yazınız. (10p)

2011-2012 Güz Yarıyılı Derleyici Tasarımı Final Sınavı Tarih: 18 Ocak 2012 Çarşamba 1. Birinci dereceden bir bilinmeyenli denklem üreten bir gramer veriliyor. a) Gramerin bir kuralı aşağıdaki gibi tanımlanmış ise bu tanımlama için JavaCC'nin göstereceği uyarıyı belirleyiniz ve düzeltiniz. (10p) Exp E() : { Exp a=null, b; { (a=t() <PLUS> b=e() {a=new Plus(a, b);)* {return a; b) Bir denklemden oluşan girdi verisini ayrıştırma işlemi aşağıda verilen parse() metodu ile yapılmaktadır. Bu metodu iki ve daha fazla sayıda denklemden oluşan girdi verilerini de ayrıştırabilecek şekilde yeniden düzenleyiniz. (10p) Exp parse() : { Exp a; { a=e() (<EOF> <EOL>) {return a; 2. Haskell programlama dilinde aritmetik ifadeler prefix notasyona dönüştürülürken işleçler parantez içerisinde yazılır. İşlece ilaveten işlenenlerden biri de parantez içerisine alınabilmektedir. Aşağıdaki tabloda bu çeşit ifadeler için örnekler gösterilmiştir. Girdi verisi Değeri 7 7 (+) 3 5 8 (3*) 4 12 (+((*) 3 4)) 5 17 (*) 4 ((+) 3 2) 20 (+2) ((*) 3 4) 14 (+) ((*) 3 4) ((+) 5 6) 23 Yukarıda belirtilen ve sadece + ile * işlecini içeren ifadeleri için a) Bir LL(1) grameri yazınız. (15p) b) Gramer için bir ayrıştırıcıyı (parser) sözdizim ağacını (syntax tree) üreten ifadelerle birlikte JavaCC notasyonunda tanımlayınız. (10p) c) intanceof işlecini kullanarak soyut sözdizim ağacını değerlendiren (ifadenin değerini hesaplayan) bir eval() metodu yazınız. (15p) 3. Aşağıda verilen ifadeyi Tree diline dönüştürünüz ve temel bloklarına ayırınız. (25p) int x = b <= 0? 1 : b*2; 4. Temel bloklarına ayrılmış bir veri üzerinde hedef makine diline ait emirler nasıl seçilir? Kısaca açıklayınız ve Soru 3'deki Tree verisi üzerinde gösteriniz. (15p) abstract class Exp CONST(int value) NAME(Label label) TEMP(Temp.Temp temp) BINOP(int binop, Exp left, Exp right) MEM(Exp exp) CALL(Exp func, ExpList args) ESEQ(Stm stm, Exp exp) ExpList(Exp head, ExpList tail) Tree dili işlev ve değişmezleri abstract class Stm MOVE(Exp dst, Exp src) EXP(Exp exp) JUMP(Exp exp, Temp.LabelList targets) CJUMP(int relop, Exp left, Exp right, Label iftrue, Label iffalse) SEQ(Stm left, Stm right) LABEL(Label label) StmList(Stm head, StmList tail) final static int BINOP.PLUS, BINOP.MINUS, BINOP.MUL, BINOP.DIV, BINOP.AND, BINOP.OR, BINOP.LSHIFT, BINOP.RSHIFT, BINOP.ARSHIFT, BINOP.XOR; final static int CJUMP.EQ, CJUMP.NE, CJUMP.LT, CJUMP.GT, CJUMP.LE, CJUMP.GE, CJUMP.ULT, CJUMP.ULE, CJUMP.UGT, CJUMP.UGE;

2012-2013 Güz Yarıyılı Derleyici Tasarımı 1. Ara Sınavı Tarih: 23 Kasım 2012 Cuma 1. C programlama diline ait gramer kuralları göz önüne alındığında aşağıda verilen ifade için C derleyicisinin üreteceği hataları ve üretildikleri bileşenleri belirleyiniz. (10p) char 2c = 2c ; 2. Aşağıda verilen gramerin FIRST/FOLLOW setleri yardımıyla ayrıştırma tablosunu (parsing table) oluşturunuz ve LL(1) grameri olup olmadığını belirleyiniz. Bu gramer ile üretilen girdi ifadeleri için el yordamıyla bir ayrıştırıcı yazınız. (25p) E ("+" "-" "*" "/") E E E id num 3. Polinomlarda çarpma ve sadeleştirme işlemlerini yapabilen bir yorumlayıcı JavaCC aracı kullanılarak yazılmak isteniyor. Çarpım biçiminde girilen polinomlar için önce çarpma ardından sadeleştirme işlemi yapılacaktır. Aşağıdaki tabloda bazı girdi verisi örnekleri ve yorumlama sonuçları gösterilmiştir. Polinomların parantez içerisinde girildiğine dikkat ediniz. No Girdi verisi Çıktı verisi (yorumlama sonucu) 1 (-x^2+5+x^2-3) 2 2 (x^2-1)(x^2+1) -1+x^4 3 (x-2)(x^2-2x-3) 6+x-4x^2+x^3 4 (x+1)(x+2)(x-3) -6-7x+x^3 5 (x^2-3)(3-x+x^2) -9+3x-x^3+x^4 6 (x-1)(x-1)(x-1)(x-1) 1-4x+6x^2-4x^3+x^4 a) Bu çeşit girdi verilerini üretebilen bir LL(1) grameri yazınız. (10p) b) Gramere ait sözdizim sınıflarını nesneye dayalı bir programlama dilinde tanımlayınız. (10p) c) Girdi verilerinin sözdizim analizini yapabilecek bir ayrıştırıcıyı (parser), sözdizim ağacı (syntax tree) oluşturan ifadeleri de ekleyerek JavaCC notasyonunda yazınız. (15p) d) Tabloda gösterilen 3 no'lu girdi verisi için sözdizim ağacını (b)'de tanımladığınız sözdizim sınıflarını kullanarak oluşturunuz. (5p) e) Girdi verisini sözdizim ağacı üzerinden değerlendirebilmek için en az iki sözdizim sınıfına eklenecek eval() metodunu tanımlayınız. (10p) 4. Bir programlama dili derleyicisi aynı isimli bir fonksiyonun her bir çağrımına aynı aktivasyon kaydını tahsis ediyor ise bu dile modern programlama dillerinde bulunan hangi özellikler eklenemez? Kısaca açıklayınız. (15p)

2012-2013 Güz Yarıyılı Derleyici Tasarımı Final Sınavı Tarih: 16 Ocak 2013 Çarşamba Süre: 100 dakika 1. Aşağıda bir gramer kuralının JavaCC sözdizimiyle yapılan tanımlamasının LL(1)'e uygun olup olmadığını belirleyiniz ve uygun değilse yeniden düzenleyiniz. (15p) void E() : { { E() ("!" "=")? "=" T() T() 2. Matematiksel ifadelerin limitini hesaplayan bir yorumlayıcı JavaCC aracıyla yazılmak isteniyor. İfadelerin sadece ln, e, sin ve cos fonksiyonlarını, çıkarma (-), bölme (/) ve üs alma (^) işleçlerini, x değişkenini, tamsayıları ve açma/kapama parantezlerini içerebilecektir. Yorumlayıcının girdi verisi olacak bazı örnek limit ifadeleri aşağıda verilmiştir. lim[x->2][e^(x-2)-4], lim[x->1][(x-1)/ln(x)], lim[x->0][sin(x)^(2x)] Limit hesaplamalarında 0/0 ve 0 0 gibi iki belirsizlik ile karşılaşıldığında aşağıda verilen yöntemler uygulanacaktır; f ( a) = 0 ve g ( a) = 0 ise, lim f ( x) x > a g ( x) = e ln f ( x) lim x > a1/ g ( x) veya ' f ( x) f ( x) lim = lim x > a ' g( x) x > a g ( x) İfadeleri, verilen bir x için değerlendiren (EvalVisitor) ve türevlerini (DeriveVisitor) hesaplayan sınıfların Visitor tasarım deseni ile tanımlandığını varsayarak, a) Limit ifadelerini üretebilen bir LL(1) gramerini, işleç öncelik düzeyi ve birleşme yönlerine uygun olarak yazınız. (10p) b) Gramerin / ve ^ işleçlerini içeren iki kuralını, sözdizim ağacını (syntax tree) üreten ifadelerle birlikte JavaCC sözdizimiyle tanımlayınız. (10p) c) Bu iki işleci içeren düğümler için limiti hesaplayan visit() metotlarını yazınız. (15) x 3. Soru 2'de yer alan yorumlayıcının sözdizim sınıfları ile lim (sin( x)) 2 ifadesinin soyut x > 0 sözdizim ağacını (abstract syntax tree) oluşturunuz, Tree diline dönüştürünüz ve temel bloklarına ayırınız. Trigonometrik fonksiyon değerlendirmelerinde Maclaurin serisinin ilk 100 terimini kullanabilirsiniz. (30p) 4. Derleyicilerde ara dilden makine diline yapılacak dönüşümlerde kod performansını iyileştirmek için hangi konular göz önüne alınır? Maddeler halinde kısaca açıklayınız. (20p) abstract class Exp CONST(int value) NAME(Label label) TEMP(Temp.Temp temp) BINOP(int binop, Exp left, Exp right) MEM(Exp exp) CALL(Exp func, ExpList args) ESEQ(Stm stm, Exp exp) ExpList(Exp head, ExpList tail) Tree dili işlev ve değişmezleri abstract class Stm MOVE(Exp dst, Exp src) EXP(Exp exp) JUMP(Exp exp, Temp.LabelList targets) CJUMP(int relop, Exp left, Exp right, Label iftrue, Label iffalse) SEQ(Stm left, Stm right) LABEL(Label label) StmList(Stm head, StmList tail) final static int BINOP.PLUS, BINOP.MINUS, BINOP.MUL, BINOP.DIV, BINOP.AND, BINOP.OR, BINOP.LSHIFT, BINOP.RSHIFT, BINOP.ARSHIFT, BINOP.XOR; final static int CJUMP.EQ, CJUMP.NE, CJUMP.LT, CJUMP.GT, CJUMP.LE, CJUMP.GE, CJUMP.ULT, CJUMP.ULE, CJUMP.UGT, CJUMP.UGE;

2013-2014 Güz Yarıyılı Derleyici Tasarımı Ara Sınavı Soruları Tarih: 18 Kasım 2013 Pazartesi 1. Bir kelime ayrıştırıcının (scanner, lexer) aynı karakter(ler)le başlayan işleçleri nasıl ayrıştırdığını kısaca açıklayınız ve aşağıdaki ifadeyi token dizisine ayrıştırınız. (15p) x += x +++ x; 2. Aşağıdaki örnekte görüldüğü gibi tamsayı dizilerinin oluşturduğu bir kaynak verideki 5 ile tam bölünebilen sayıları gösteren bir kelime ayrıştırıcıyı JavaCC notasyonunda tanımlayınız. Sayılar üzerinde herhangi bir hesaplama (örneğin, sayının son rakamına dayalı karşılaştırma, % işlecinin kullanımı gibi) yapmayınız. (20p) 235 4737 26012 0049 50... 3. 1+1/(1+...(1+1/x)...) biçiminde girilen bir ifadeyi yanda gösterilen kesirli matematik ifadesi gibi değerlendiren bir yorumlayıcı JavaCC aracı kullanılarak yazılmak isteniyor. a) Bu çeşit girdi verilerini üretebilen bir LL(1) grameri geliştiriniz. (15p) b) Gramere ait sözdizim sınıflarını en az sayıda olacak şekilde nesneye dayalı bir programlama dilinde yazınız. (10p) 1 1+ 1+..... 1 1+ x c) Girdi verilerinin sözdizim analizini yapabilecek bir ayrıştırıcıyı (parser), sözdizim ağacı (syntax tree) oluşturan ifadeleri de ekleyerek JavaCC notasyonunda yazınız. (15p) d) 1+1/(1+1/x) girdi verisi için sözdizim ağacını (b)'de tanımladığınız sözdizim sınıflarını kullanarak oluşturunuz. (5p) 4. Soru 3'de belirtilen biçimdeki (en az bir kesir çizgisi olan) girdi verilerini rasgele üretebilen bir programı, el yordamıyla aşağıya yinelemeli ayrıştırıcı (recursive-descent parser) tanımlama yöntemini kullanarak yazınız. (20p) Hatırlatma: Bu yöntemde LL(1) gramerinin her bir kuralı bir fonksiyon olarak kodlanır.

2013-2014 Güz Yarıyılı Derleyici Tasarımı Final Sınavı Tarih: 9 Ocak 2014 Perşembe 1. 2 ile 10 arasındaki sayı tabanları üzerinde dönüşüm işlemi (taban aritmetiği) yapabilen bir yorumlayıcı, JavaCC aracı kullanılarak yazılmak isteniyor. Belirli bir taban için hesaplanması istenen sayı "?" ile girilecektir. Aşağıdaki tabloda bazı girdi verisi örnekleri ve yorumlama (dönüşüm) sonuçları gösterilmiştir. Sayı ve tabanının "," ile ayrılarak aynı parantez içerisinde girildiğine, 10 tabanındaki sayı bildirimleri için parantez kullanılmadığına dikkat ediniz. No Girdi verisi Çıktı verisi (yorumlama sonucu) 1 (2010,3)=(?,5) 212 2 (?,6)=(3201,4) 1013 3 390=(?,7) 1065 4 (1065,7)=? 390 5 (?,2)=2014 11111011110 a) Bu çeşit veriler için en az sayıda non-terminal içeren bir LL(1) grameri yazınız. (10p) b) Girdi verilerinin sözdizim analizini yapabilen ve sayı-taban uyumsuzluğu ile "?" karakteri girme durumunu anlayabilen bir ayrıştırıcıyı (parser), sözdizim ağacı (syntax tree) oluşturan ifadeleri de ekleyerek JavaCC notasyonunda yazınız. (15p) c) Gramere ait sözdizim sınıflarını, nesne ağacı üzerinden değerlendirme yapabilen eval() metotlarını ekleyerek tanımlayınız. (10p) 2. Java programlama dilinde tanımlaması yapılan bir metot yan tarafta gösteriliyor. a) Bu metot için bellekte oluşturulacak bir aktivasyon kaydının görüntüsünü çiziniz. (10p) b) Metot gövdesini düzenleyerek Tree diline dönüştürünüz ve temel bloklarına ayırınız. (15p) int foo(int[] a, int n) { int t = 0; for (int i=0; i<n; i++) t += a[i]; return t; c) Tree dilindeki ana kod bloğunu optimal desenlerle kaplayarak Jouette emir seti yardımıyla makine diline dönüştürünüz. (10p) 3. Fibonacci sayı dizisini hesaplayan kod bloğu yan tarafta veriliyor. a) Kontrol akış çizgesini (graph) çiziniz ve i, a, b ve c değişkenlerinin hangi çizge kenarları üzerinde canlı olduklarını belirtiniz. (10p) b) Bu değişkenlerin kaydedici (register) tahsisi için çizge renklendirmesinin nasıl yapılacağını a=0; b=1; i=0; L1: if (i<100) then goto L2; print a; c=a+b; a=b; b=c; i++; goto L1; L2: return b; kısaca açıklayınız ve en az kaç kaydedici gerekeceğini belirtiniz. (10p) c) 3 kaydedicili bir sistem için çizge renklendirmesini gerçekleştiriniz. (10p) abstract class Exp CONST(int value) NAME(Label label) TEMP(Temp.Temp temp) BINOP(int binop, Exp left, Exp right) MEM(Exp exp) CALL(Exp func, ExpList args) ESEQ(Stm stm, Exp exp) ExpList(Exp head, ExpList tail) Tree dili işlev ve değişmezleri abstract class Stm MOVE(Exp dst, Exp src) EXP(Exp exp) JUMP(Exp exp, Temp.LabelList targets) CJUMP(int relop, Exp left, Exp right, Label iftrue, Label iffalse) SEQ(Stm left, Stm right) LABEL(Label label) StmList(Stm head, StmList tail) final static int BINOP.PLUS, BINOP.MINUS, BINOP.MUL, BINOP.DIV, BINOP.AND, BINOP.OR, BINOP.LSHIFT, BINOP.RSHIFT, BINOP.ARSHIFT, BINOP.XOR; final static int CJUMP.EQ, CJUMP.NE, CJUMP.LT, CJUMP.GT, CJUMP.LE, CJUMP.GE, CJUMP.ULT, CJUMP.ULE, CJUMP.UGT, CJUMP.UGE; ADD r i r j + r k MUL r i r j * r k SUB r i r j - r k Jouette aritmetik ve bellek emirleri DIV r i r j + r k ADDI r i r j + c SUBI r i r j c [x] notasyonu x adresindeki bir kelimeyi temsil eder. LOAD r i M[r j +c] STORE M[r j +c] r i MOVEM M[r j ] M[r i ]

2014-2015 Güz Yarıyılı Derleyici Tasarımı Ara Sınavı Soruları Tarih: 8 Kasım 2014 Cumartesi 1. Bir derleyicinin aşağıda verilen kaynak kod için AST (sözdizim ağacı) oluşturup oluşturamayacağını değerlendiriniz ve kodun içerdiği hataların ilgili oldukları bileşenleri belirtiniz. (15p) void f(int a) { char a; if (;) =3--; 2. Girdi verisini bir metin dosyasından okuyan ve sadece harflerden oluşan en uzun kelimeyi gösterebilen derleyici bileşenlerinin her birini aşağıda belirtildiği gibi tanımlayınız. Bir String str verisinin uzunluğu str.length() ile hesaplanır. a) JavaCC'yi kullanarak kelime ayrıştırıcıyı (scanner) (10p) b) JavaCC'yi kullanarak bir sözdizim ayrıştırıcısını (parser) (10p) c) C yada Java dilini kullanarak aşağı yinelemeli ayrıştırıcıyı (recursive-descent parser) (10p) 3. Aşağıda verilen gramerin yan yana 1'ler içermeyen bütün ikili sayıları üretip üretemeyeceğini açıklayınız ve gerekli ise grameri düzelterek LL(1) gramerine dönüştürünüz ve FIRST/FOLLOW setlerinin uygunluğunu değerlendiriniz. (20p) B -> B 0 B -> B 0 1 B -> 4. 1+(2+++3)+++5 ifadesini aşağıda gösterildiği gibi hesaplayan bir programlama dili veriliyor (İfadelerin herhangi bir sayıda parantez içerebileceğine dikkat ediniz). 1+(2+++3)+++5 = 1+(3+3)+++5=1+6+++5 = 1+7+5 =1+12 = 13 a) Bu çeşit ifadeler üretebilen bir LL(1) grameri yazınız. (10p) b) Gramere ait sözdizim sınıflarını nesneye dayalı bir programlama dilinde tanımlayınız. (10p) c) Bu sınıfların yardımı ile yukarıda verilen ifade için sözdizim ağacını oluşturunuz. (5p) d) Böyle ifadeleri Visitor tasarım desenini kullanarak değerlendirebilen bir yorumlayıcı yazınız. (10p)

2014-2015 Güz Yarıyılı Derleyici Tasarımı Final Sınavı Tarih: 7 Ocak 2014 Çarşamba 1. Birinci dereceden polinomlar üzerinde kalan bulma işlemleri yapabilen bir yorumlayıcı yazılmak isteniyor. Genel olarak p(x)%g(x) biçiminde girilecek olan girdi verisinde; a, b ve c tamsayılar olmak üzere, p(x) fonksiyonu ax ve/veya b terimlerini herhangi bir sayı yada sırada içerebilen ifadelerden, g(x) fonksiyonu ise x+c ifadesinden meydana gelecektir. Aşağıdaki tabloda bazı girdi verisi örnekleri ve yorumlayıcı çıktısı gösterilmiştir. No Girdi verisi Çıktı verisi 1 3x-2 % x-3 p(3)=7 2 3-x+4+2x % x+1 p(-1)=6 3-2x+5-3+x % x+2 p(-2)=4 4 -x+3x-3-2+1 % x-1 p(1)=-2 5-1+x+2-2x+3+6 % x-2 p(2)=8 a) Bu çeşit girdiler için en az sayıda non-terminal içeren bir LL(1) grameri yazınız. (10p) b) Gramer kurallarına ait sözdizim sınıflarını, Visitor arayüzü için accept() metotları ekleyerek tanımlayınız. (10p) c) Girdi verilerinin sözdizim analizini yapabilen bir ayrıştırıcıyı (parser), sözdizim ağacı (syntax tree) oluşturan ifadeleri de ekleyerek JavaCC notasyonunda yazınız. (10p) d) Yorumlayıcıyı Visitor tasarım desenini kullanarak kodlayınız. (10p) 2. Bir derleyicide kaynak verinin Tree diline dönüşümü, SEQ ve ESEQ işlevlerini ifade ağacından çıkarmak için yeniden düzenlenir ve temel bloklara ayrılır. Bu düzenlemenin sebebini kısaca açıklayarak, aşağıdaki kaynak veri üzerinde Tree diline dönüşüm, SEQ ve ESEQ düğümlerini çıkarma ve bloklara ayırma işlemlerini gösteriniz. (20p) x = 2 + (x = 3); 3. Aşağıda verilen Tree dili ifadesini en uygun optimal desenlerle kaplayarak Jouette emir seti yardımıyla makine diline dönüştürünüz. (20p) MOVE(MEM(BINOP(PLUS, BINOP(PLUS, CONST(100), MEM(TEMP(tx))), TEMP(fp))), CONST(2)) 4. Yan tarafta gösterilen programa göre aşağıdaki soruları cevaplayınız. a) Kontrol akış grafiğini çiziniz. (5p) b) Değişkenlerin canlı oldukları çizge kenarlarını belirtiniz ve karışım grafiğini çiziniz. (10p) c) Değişkenler için kaç adet kaydediciye ihtiyaç olduğunu belirleyiniz. (5p) 1: if a < 0 goto 8 2: b = 1; 3: goto 7 4: c = a * b 5: a = a - 1 6: b = c 7: if a > 1 goto 4 8: return b abstract class Exp CONST(int value) NAME(Label label) TEMP(Temp.Temp temp) BINOP(int binop, Exp left, Exp right) MEM(Exp exp) CALL(Exp func, ExpList args) ESEQ(Stm stm, Exp exp) ExpList(Exp head, ExpList tail) Tree dili işlev ve değişmezleri abstract class Stm MOVE(Exp dst, Exp src) EXP(Exp exp) JUMP(Exp exp, Temp.LabelList targets) CJUMP(int relop, Exp left, Exp right, Label iftrue, Label iffalse) SEQ(Stm left, Stm right) LABEL(Label label) StmList(Stm head, StmList tail) final static int BINOP.PLUS, BINOP.MINUS, BINOP.MUL, BINOP.DIV, BINOP.AND, BINOP.OR, BINOP.LSHIFT, BINOP.RSHIFT, BINOP.ARSHIFT, BINOP.XOR; final static int CJUMP.EQ, CJUMP.NE, CJUMP.LT, CJUMP.GT, CJUMP.LE, CJUMP.GE, CJUMP.ULT, CJUMP.ULE, CJUMP.UGT, CJUMP.UGE; Jouette aritmetik ve bellek emirleri ([x]: x adresindeki kelimeyi temsil eder.) ADD r i r j + r k MUL r i r j * r k SUB r i r j - r k DIV r i r j + r k ADDI r i r j + c SUBI r i r j c LOAD r i M[r j +c] STORE M[r j +c] r i MOVEM M[r j ] M[r i ]

2015-2016 Güz Yarıyılı Derleyici Tasarımı Ara Sınavı Soruları Tarih: 13 Kasım 2015 Cuma 1. İkili sayılar üzerinde üç token sınıfı aşağıdaki gibi tanımlanıyor. R1: 2 adet 0 içeren ikili sayılar (TZ) R2: 2 ile tam bölünebilen ikili sayılar (TN) R3: 2 basamaklı ikili sayılar (TB) a) Bu sınıfları düzenli ifadeleri (regular expressions) kullanarak tanımlayınız. (10p) b) Aşağıda verilen düzenli ifade yardımıyla token ayrıştırması yapan bir kelimesel ayrıştırıcının (lexical analyser) 10011011 01011 011010 girdi verisi için üreteceği token dizisini belirleyiniz. (10p) R = R1 R2 R3 2. Aşağıda terminallerin çift tırnak içerisinde yazıldığı bir gramer veriliyor. E -> E "!" "(" E ")" T T -> "1" "2" "3" c) Bu grameri LL(1) gramerine dönüştürünüz. (10p) d) Yeni gramerin FIRST ve FOLLOW setlerini belirleyiniz. (10p) e) Gramer ile üretilen ifadeler için bir aşağı yinelemeli ayrıştırıcı (recursive-descent parser) yazınız. (10p) 3. Tamsayılar ve, &, ^ işleçlerini içeren ifadeler C dilindeki anlamları ile değerlendirilmek isteniyor. Ayrıştırıcı içerisinde sırasıyla Or, And ve Exor sözdizim sınıflarıyla temsil edilen bu işleçler soldan birleşme yönüne sahip olup değerlendirme sıraları aşağıdaki örnek ifadede gösterilmiştir. 2 3 & 5 ^ 7 = 2 1 ^ 7 = 2 6 = 6 a) Bu ifadeleri üretebilen bir LL(1) grameri yazınız. (10p) b) And sınıfını nesneye dayalı bir programlama dilinde tanımlayınız. (5p) c) Ayrıştırıcının (parser) And metodunu JavaCC notasyonunda yazınız. (10p) d) Nesne ağacındaki And düğümünü değerlendirecek eval() metodunu yazınız. (10p) 4. Java programlama dilinde aşağıda verilen sınıf tanımlamasının yapılabilmesinin sembol tablosu ile ilişkisini (tablo organizasyonu üzerindeki etkisini) açıklayınız ve sembol tablosuna eklenecek verileri belirleyiniz. (15p) class Exp { Exp Exp; Exp Exp(Exp Exp) { return Exp(Exp);

2015-2016 Güz Yarıyılı Derleyici Tasarımı Final Sınavı Tarih: 3 Ocak 2016 Pazar 1. Özyinelemeli tanımlamaya sahip fonksiyonları (recurrence functions), verilen bir (formal) parametreye dayalı olarak değerlendiren bir yorumlayıcı yazılmak isteniyor. Bu türden iki fonksiyon örneği aşağıda gösterilmiştir. T(0) = 1 T(0) = 0 T(n) = n * T(n-1) T(n) = T(n-1) + n Yorumlayıcı içerisinde fonksiyonun formal parametresini ve değerini tutmak için yanda gösterilen tablo kullanılacaktır. Tabloda, parametre isimleri (her bir fonksiyon aktivas- class Table { int n = 0; Hashtable table = new Hashtable(); public void inc() { ++n; public void dec() { --n; public void put(string id, int d) { table.put(id+n, new Integer(d)); public int get(string id) { return ((Integer)table.get(id+n)).intValue(); yonunun kendi formal parametresine erişebilmesini sağlamak için) bir tamsayı ile birleştirilerek saklanır. a) Bu fonksiyonlar için en az sayıda non-terminal içeren bir LL(1) grameri yazınız. (15p) b) Gramer kurallarına sözdizim sınıfları atayarak, yukarıda verilen faktöriyel fonksiyonu için en uygun nesne tanımlamasını yapınız. (15p) Eq f = new... c) Gramer kurallarından birinin aşağıdaki gibi tanımlandığını varsayarak, FuncEQ düğümünü değerlendiren ve ara çağrım sonuçlarını gösterebilen bir visit() metodu yazınız. (10p) S -> "T" "(" E ")" "=" E (FuncEQ) 2. Yanda verilen Tree dili ifadesinden SEQ, ESEQ ve iç içe bulunan CALL düğümleri çıkarılarak doğrusallaştırma yapılmak isteniyor. Bu ifadeyi, a) Doğrusallaştırma işlemine imkan verecek biçime dönüştürünüz (10p) b) Temel bloklarına ayırınız. (10p) Örnek: MOVE(TEMP(t),CALL(ESEQ(s,e),as)) ifadesi SEQ(s,MOVE(TEMP(t),CALL(e,as))) biçiminde doğrusallaştırılır. MOVE(TEMP(a),CALL(NAME(f), [CALL(NAME(g), [ESEQ(SEQ(MOVE(TEMP(b), CONST(0)),SEQ(CJUMP(EQ,TEMP(c), CONST(6),tr,fl),SEQ(LABEL(tr), SEQ(MOVE(TEMP(b),CONST(1)), LABEL(fl)))),TEMP(b)) ]) ])) 3. Aşağıdaki ifadeyi, i'nin kaydedicide ve a'nın aktivasyon kaydında bulunduğunu varsayarak, a[i]++; a) Tree diline dönüştürünüz. (10p) b) Maximal munch algoritmasını kullanarak Jouette emirlerine göre optimal desenlerle kaplayınız. (10p) 4. Değişkenlere kaydedici atama sürecinde, karışım grafikleri (interference graphs) renklendirilirken MOVE emirlerinin iki çeşit değerlendirmesi yapılabilir; grafikten çıkarılmaları yada kaynak ile hedef düğümlerinin birleştirilmesi. Bu değerlendirmelerde, a ve b düğümlerinin ab olarak birleştirilebilmesi için iki strateji kullanılır: Briggs stratejisi: ab düğümünün K ve üzerinde dereceye sahip K'dan daha az sayıda komşu düğümü olacaksa George stratejisi: a düğümünün her bir komşu düğümü, ya b'ye de komşu yada derecesi K'nın altında ise MOVE emirleri kesikli çizgilerle gösterilen yukarıdaki karışım grafiğinde; a) Sadeleştirme işlemlerine başlamadan önce, hangi MOVE emirlerinin hangi strateji ile birleştirilebileceğini açıklayınız (10p) b) 3 kaydediciye sahip (K=3) bir sistem için R, G, B harflerini kullanarak (örneğin a->g gibi) grafiğin renklendirmesini yapınız. (10p) Yardımcı tablolar arka sayfadadır ->

abstract class Exp CONST(int value) NAME(Label label) TEMP(Temp.Temp temp) BINOP(int binop, Exp left, Exp right) MEM(Exp exp) CALL(Exp func, ExpList args) ESEQ(Stm stm, Exp exp) ExpList(Exp head, ExpList tail) Tree dili işlev ve değişmezleri abstract class Stm MOVE(Exp dst, Exp src) EXP(Exp exp) JUMP(Exp exp, Temp.LabelList targets) CJUMP(int relop, Exp left, Exp right, Label iftrue, Label iffalse) SEQ(Stm left, Stm right) LABEL(Label label) StmList(Stm head, StmList tail) final static int BINOP.PLUS, BINOP.MINUS, BINOP.MUL, BINOP.DIV, BINOP.AND, BINOP.OR, BINOP.LSHIFT, BINOP.RSHIFT, BINOP.ARSHIFT, BINOP.XOR; final static int CJUMP.EQ, CJUMP.NE, CJUMP.LT, CJUMP.GT, CJUMP.LE, CJUMP.GE, CJUMP.ULT, CJUMP.ULE, CJUMP.UGT, CJUMP.UGE; Jouette aritmetik ve bellek emirleri