2015-11-19 17 views
5

Şu anda bir C-Derleme derleyicisinin yazılması sürecindeyim, pratik olması gerekmiyor, ancak eğitim değeri için bunu yapmak istiyorum. Anahtar kelimeleri test ettiğimde merak ettim, dosyadaki bir sonraki kelimede okumaktan çok daha verimli bir yol var ve daha sonra anahtar kelimeleri test eden ifadeler varsa, bir grup iç içe geçmiş oluyor. Daha iyi bir yolu var mı?Bir C Derleyici yazarken anahtar kelimeleri nasıl ayrıştırmalıyım?

+2

Mükemmel hashing deneyebilirsiniz, ancak bu fazın performans darboğaz olması muhtemel değildir. –

+2

[ayrıştırma] etiketini [tarama] olarak değiştiriyorum. Bireysel belirteçlerin tanımlanması, derleyicinin ilk aşaması olan tarayıcıdır ve ikinci aşamada ayrıştırıcı tarafından değil. –

+0

Ve şimdi [tarama] 'nın yanlış etiket olduğunu fark ettim. Tekrar değiştirdim, [lexer]. –

cevap

8

Sorunuz aslında oldukça belirgindir. Ayrıca, tarayıcı olarak da bilinen sözcüksel analizcinin nasıl oluşturulacağını ve anahtar kelimelerin verimli ve kolay bir şekilde nasıl tanınacağını soruyorsunuz. Tarayıcı, tipik bir derleyicinin ilk aşamasıdır ve bir dizi karakter olan kaynak kodu, bir simge, bir sayı, bir operatör veya bir anahtar kelime gibi bir birim olduğunda, bir simge sırasına dönüştürür.

Anahtar kelimeler, genel tanımlayıcıların kalıbıyla eşleştiğinden, genel bir anahtar sözcük, anahtar kelime olduğu bilgisiyle birlikte, tüm anahtar kelimeleri sembol tablosuna yerleştirmektir. Ardından, tarayıcı bir tanımlayıcı bulduğunda, her zamanki gibi, bu tanımlayıcının daha önce görülüp görülmediğini görmek için sembol tablosunu arar. Bu tanımlayıcı bir kewyord ise, hangi anahtar kelime ile ilgili bilgilerle birlikte bulunur.

4

Bunu bir sınıfın parçası için mi yapıyorsunuz? Eğer öyleyse, ayrıştırma ve lexing konusunda kurallar olmalıdır. Değilse, çok işin içindesiniz!

Gerçek bir derleyicinin yazılması, bir sürü ifade içeriğinden geçmekten çok daha karmaşıktır, çünkü ortamı izlemeniz gerekir. Derslere, işlevlere, işlev çağrılarına, sınıf örneklemelerine, özyinel işlevlere nasıl izin verdiğinizi düşünmelisiniz ... liste uzayıp gidiyor.

konuda UC Berkeley'de ders dersler, yani ayrıştırma, lexing, kod üretme bir göz atın ve araçları gerekir:

http://www-inst.eecs.berkeley.edu/~cs164/fa13/

Not olduğunu bu özel kullanılan C kurs ++ Assembly derleyicisine bir Python2.5 yazmak, ancak Dersler ve Okumalar'daki kavramlar ve bazı araçlar dil ile sınırlı değildir.

3

Anahtar sözcükler (genel olarak jetonlar yerine), çarpışmadan bağımsız bir karma işlev üretmenin pratik olduğu kapalı bir kümedir. Set küçük olduğu için, minimum karma işlevine sahip olmak bile gerekli değildir.

0

Eğer bir demet if - else ifadeleri ve strcmp() varsa bunu yapabilirsiniz. Ancak, tüm anahtar kelimelerin yazılı ifadeleri çok çabuk sinirleniyor. Bir hash tablosunu kullanmaktan daha iyi olursunuz - derlemenin başlangıcında, tüm anahtar kelimeleri masaya koyup ardından gereken aramaları yaparsınız. Bunun dezavantajı, C'yi kullanmanız gerektiğinde, kendi karma tablonuzu yazmanız (veya bir kütüphaneden birini kullanmanız) olacaktır. Yine de, C++ kullanabilirsiniz, sonra bir harita veya STL'den unordered_map kullanabilirsiniz. Her durumda, performanstan endişe ediyorsanız, bahsettiğiniz biri gibi, bir şişe boynu olmayacaktır.

İlgili konular