Bazı şeyleri ayrıştırmayı diğerlerinden daha kolay yapan nedir?


Yanıtlar:


18

Bu konu çok karmaşık. Ayrıştırıcı algoritmaları için Google'ı kullanabilirsiniz ve bol miktarda ayrıntılı malzeme elde edersiniz.

Genel olarak:

  • Ne kadar az belirsizliğin çözülmesi gerekiyorsa, ayrıştırma süreci o kadar hızlı olur.
  • Bir karar alınmadan önce daha fazla jeton düşünülmelidir, daha karmaşık hale gelir.

Örneğin:
Bir JS ayrıştırıcısı functionbu koddaki anahtar kelimeyi gördüğünde : function xyz(a, b) {}function anahtar sözcüğü belirsizdir. Önce bir sonraki belirteci işlemeli xyzve bir işlev bildirimi olduğuna karar vermeden önce bir tanımlayıcı olduğunu görmelidir.

Ancak, eğer bir sonraki jeton vardı (biz bir işlev sabitin ilgileniyor: function(a, b) {}. Bu, ayrıştırıcının çok farklı davranmasını gerektirir, böylece ayrıştırıcıda daha fazla kod, böylece daha yavaş yürütme.

Bu iki amaç için farklı anahtar kelimeler olsaydı, belirsizlik olmazdı:

function_decl xyz(a, b, c) {} ve function_lit(a, b, c) {}

Ancak kimse böyle bir dilde yazmak istemez. Ancak WebAssembly'nin elle yazılması gerekmez. Bu, dilin insanlardan ziyade makinelere göre uyarlanmasını sağlar.


1
Bu Lisp'in çok kolay ayrıştırıldığı anlamına mı gelir?
Moses

9
@Moses: Evet, saf bir lisp ayrıştırıcısı yazmak önemsizdir, çünkü sözdizimi soyut bir sözdizimi ağacının yapısıyla homoiktir ve neredeyse hiç belirsizlik yoktur.
Phoshi

4
Başka bir iyi örnek, bytecode'dur, genellikle bir döngü anahtarı deyimi ile ayrıştırılabilir ve hepsi bu kadar.
whatsisname

@whatsisname Gerçekten, aynı normal Meclis ve Web Meclisi için de geçerlidir
marstato
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.