Ayrıştırma Ağaçları ve Soyut Sözdizimi Ağaçları arasındaki farkı açıklamak için en basit örnek nedir?


14

Anladığım kadarıyla, ayrıştırıcı bir ayrıştırma ağacı oluşturur ve daha sonra onu atar. Ancak, derleyicinin sözde kullandığı soyut bir sözdizimi ağacını da açabilir.

Ayrıştırma ağacının ve soyut sözdizimi ağacının ayrıştırma aşamasında oluşturulduğu izlenimi altındayım. O zaman birisi bunların neden farklı olduğunu açıklayabilir mi?


3
Neden farklı olmaları gerekiyor? İki farklı bakış açısından aynı şey olamazlar mı?
S.Lott

1
Bu iki "biraz farklı bakış açılarını" anladığımdan emin değilim :-(
Combinator Logic

Mesele bu. Onlar aynı şey, dolayısıyla karışıklık. Bakış açınıza bağlı olarak sadece farklı sözcükleriniz var: Ayrıştırma ve Kod Oluşturma (veya bir tercüman olması durumunda Yürütme).
S.Lott

Fark yok. Biraz hayal gücü ile olası herhangi bir soyut sözdizimi ağacı için bir sözdizimi temsili icat edilebilir. Hayal gücü yetersiz olduğunda, Lisp'in S ifadeleri her şeye uygun varsayılan bir sözdizimi olacaktır.
SK-logic

1
Yorum yapmadan önce cevabı okumalısınız. Bir fark vardır, ancak bunların ayrı veya birleştirilmiş olması bir uygulama sorunudur.
Paul

Yanıtlar:


20

Ayrıştırma ağacı aynı zamanda beton sözdizimi ağacı olarak da bilinir.

Temel olarak, soyut ağaç beton ağaçtan daha az bilgiye sahiptir. Beton ağaç, dilde her öğeyi içerirken, soyut ağaç ilginç olmayan parçaları attı.

Örneğin, ifade: (2 + 5) * 8

Beton şöyle görünüyor

  ( 2  + 5 )  * 8
  |  \ | / |  | |
  |   \|/  |  | |
   \___|__/   | |
       \______|/

Oysa soyut ağacın:

2  5 
 \/   
  +  8
   \/
   *

Somut durumlarda, parantezler ve dilin tüm parçaları ağaca dahil edilmiştir. Soyut durumda parantezler gitmiştir, çünkü bilgileri ağaç yapısına dahil edilmiştir.


Bunun hangi dilde bu şekilde uygulandığını belirtmeyi unutmuşsunuz. Çünkü bilirsiniz, ayrıştırıcı parantezleri hemen atabilir.
Ingo

1
@Ingo, cevabımdaki hiçbir şeyin bir derleyicinin parantezleri ne zaman attığını söyleyecek bir şey yok. Somut bir ayrıştırma ağacı ile soyut bir ayrıştırma ağacı arasındaki farkın ne olduğunu soruyor.
Winston Ewert

Yani, şüphesiz, talebiniz için bir kaynak adlandırabilirsiniz? Yoksa bu sadece sizin özel tanımınız mı?
Ingo



0

Anlamanız gereken ilk şey, kimsenin sizi belirli bir şekilde bir ayrıştırıcı veya derleyici yazmaya zorlamamasıdır. Özellikle, ayrıştırıcının sonucunun bir ağaç olması zorunlu değildir. Girdiyi temsil etmeye uygun herhangi bir veri yapısı olabilir.

Örneğin, aşağıdaki dil:

prog:
      definition 
    | definition ';' prog
    ;

definition: .....

tanım listesi olarak gösterilebilir. (Nitpickers bir liste olduğuna işaret edecektir olduğunu dejenere ağaç, ama neyse.)

İkincisi, ayrıştırma ağacını (veya ayrıştırıcının döndürdüğü veri yapısını) tutmaya gerek yoktur. Aksine, derleyiciler genellikle bir önceki geçişin sonuçlarını dönüştüren bir geçiş dizisi olarak oluşturulur. Bu nedenle bir derleyicinin genel düzeni şu şekilde olabilir:

parser :: String             -> Maybe [Definitions]      -- parser
pass1  :: [Definitions]      -> Maybe DesugaredProg      -- desugarer
pass2  :: DesugaredProg      -> Maybe TypedProg          -- type checker
pass3  :: TypedProg          -> Maybe AbstractTargetLang -- code generation
pass4  :: AbstractTargetLang -> Maybe String             -- pretty printer

compiler :: String           -> Maybe String    -- transform source code to target code
compiler source = do
   defs  <- parser source
   desug <- pass1 defs
   typed <- pass2 desug
   targt <- pass3 typed
   pass4 targt

Bottom Line: İnsanların söz duyarsanız ayıran ağaçlar , soyut Syntac ağaçları , beton sözdizimi ağaçları hep, vb yerine verilen amaç için uygun veri yapısı sen ceza ve.


2
Bu sorunun cevabı nasıl?
Winston Ewert

@WinstonEwert "Ayrıştırma ağacı" ve "soyut sözdizimi ağacının" soyutlamalar olduğunu ve "uygun veri yapılarından" başka bir şey ifade etmediğini iddia ediyorum. Yani yanıt genelliği içinde soru, mantıklı olmamasıdır sürece Çözümleyici dönüş türü ve dil L. derleyici XY diğer bazı geçiş dönüş türü arasındaki fark için sormak
Ingo
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.