(Bu ben daha uzundur; lütfen bana ayı.)
Bu sözdizimi kadar inşa dil birkaç iyi tanımlanmış anahtar kelime oluşur, ve bu dilde inşa ifadelerin tam aralığı: En dilleri bir "sözdizimi" denilen bir şey oluşur.
Örneğin, yalnızca giriş olarak tek haneli tamsayıları alır ve tamamen işlemlerin sırasını (Ben basit bir dil olduğunu söylemiştim) sayar basit bir dört fonksiyonlu aritmetik "dil" var diyelim. Bu dil sözdizimi ile tanımlanabilir:
// The | means "or" and the := represents definition
$expression := $number | $expression $operator $expression
$number := 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
$operator := + | - | * | /
Bu üç kural dışında, tek haneli giriş aritmetik ifadeler herhangi bir sayıda inşa edebilirsiniz. Daha sonra bileşen tipleri ($expression
, $number
, ya da $operator
) ve sonucu ile fırsatlar içine herhangi bir geçerli girdi bozulduğu bu sözdizimi için bir ayrıştırıcı yazabilirsiniz . Örneğin aşağıdaki gibi, sentezleme 3 + 4 * 5
kırılmış olabilir:
// Parentheses used for ease of explanation; they have no true syntactical meaning
$expression = 3 + 4 * 5
= $expression $operator (4 * 5) // Expand into $exp $op $exp
= $number $operator $expression // Rewrite: $exp -> $num
= $number $operator $expression $operator $expression // Expand again
= $number $operator $number $operator $number // Rewrite again
Şimdi orijinal ifadesi için bizim tanımlanan dilde, tam çözümlü sözdizimi vardır. Biz bu var, biz geçmesi ve $number $operator $number
tüm kombinasyonları sonuçlarını bulmak için bir ayrıştırıcı yazmak, ve biz sadece bir $number
sol olduğunda bir sonuç tükürmek.
Bizim orijinal ifadenin son çözümlenen sürümünde sol hiç $expression
yapıları olduğuna dikkat çekmek. $expression
her zaman dilinde diğer şeylerin bir kombinasyonu azaltılabilir olmasıdır.
PHP çok aynıdır: dil yapıları bizim $number
veya $operator
eşdeğer olarak kabul edilmektedir. Bunlar, cannot be reduced into other language constructs; Bunun yerine, onlar dil inşa edildiği temel birimler sensin. Dil yapıları ile doğrudan ayrıştırıcı fiyatlar: işlevleri ve dil yapıları arasındaki önemli fark şudur. Bu dil yapılarının içine işlevlerini kolaylaştırır.
Diğerleri PHP çözümleyici uygulama özel teknik ayrıntılar tamamen bağlıdır yok ederken dil yapıları ya da parantezler ve bazı dönüş değerlerine sahip akıl gerektiren olmayabilir ki sebebi. Ben ayrıştırıcı nasıl çalıştığını iyi yetişmiş değilim, bu yüzden özellikle bu soruları, ancak bu ile başlayan ikinci bir dil için hayal bile edemiyorum:
$expression := ($expression) | ...
Etkili, bu dil bulduğu ifadeleri alır ve çevredeki parantez kurtulmak ücretsizdir. PHP (ve burada saf varsayımları istihdam ediyorum) kendi dil yapılarının benzer bir şey istihdam edilebilir: incelenir oluyor önce print("Hello")
print "Hello"
düşürülebilir alabilirsiniz, ya da tam tersi (dil tanımlamaları ) parantez yanı sıra onlardan kurtulmak ekleyebilirsiniz.
Bu echo
veya print
gibi dil yapılarını yeniden tanımlayabilirsiniz neden kök: fonksiyonları bir dil yapıları kümesi eşleştirilir oysa onlar etkili, çözümleyici içine kodlanmış konum ve ayrıştırıcı Eğer dil yapıları veya ifadelerin kendi kümesi yerine, derleme veya zamanında bu eşleştirmeyi değiştirebilirsiniz.
Günün sonunda, yapıları ve ifadeler arasındaki iç fark şudur: dil yapıları çözümleyici tarafından anlaşılamaz ve dağıtılır. Yerleşik işlevleri, dil tarafından sağlanan olurken, ayrıştırma önce eşleştirilir ve bir dil yapıları kümesi basitleştirilmiş.
Daha fazla bilgi:
- Backus-Naur form, biçimsel dilleri tanımlamak için kullanılan sözdizimi (yacc'ait bu formu kullanır)
Edit:, diğer bazı yanıtları yoluyla okuma, insanların iyi puan yapmak. Bunlar arasında:
- Bir dil yerleşik bir işlevi daha aramak için hızlıdır. Sadece marjinal eğer PHP yorumlayıcı ayrıştırma önce, dil yerleşik eşdeğerleri bu işlevi haritasına gerekmez, çünkü bu, doğrudur. Modern bir makine üzerinde olsa da, fark oldukça ihmal edilebilir düzeydedir.
- Yerleşik bir dil hata denetimini atlar. Bu da her yerleşiğini için PHP iç uygulanmasına bağlı olarak, doğru olmayabilir. Bu daha sık değil, fonksiyonlar yerleşikleri değil daha gelişmiş hata denetimi ve diğer özelliğe sahip olacağı kesinlikle doğrudur.
- Dil yapılar fonksiyonu geri aramalar olarak kullanılamaz. Bu bir kurgudur, çünkü doğrudur not a function. Bunlar ayrı varlıklar demektir. Bir yerleşiğine kod zaman, argüman alan bir fonksiyon kodlama değil - yerleşiği sözdizimi çözümleyici tarafından doğrudan ele alınır ve yerine bir işlevi daha bir yerleşiğini olarak kabul edilmektedir. (Bu, birinci sınıf fonksiyonları ile dil düşünün anlamak daha kolay olabilir:. Etkili, nesnelerin olarak etrafında fonksiyonları geçebilir Bunu yerleşikleri ile yapamazsınız.)