2017-05-02 66 views
6
declaration-seq: 
    declaration 
    declaration-seq declaration 

bu şekilde değil:Neden C++ standardında beyan-seq bu şekilde yazılmıştır?

declaration-seq: 
    declaration 
    declaration declaration-seq 

iki tanım değiştirilebilir musunuz? Onların arasındaki fark ne?

+3

, sol özyinelemeli kuralların ayrıştırılması daha kolaydır; kural özümlemesi, her defasında yeni bir deklarasyon belirlenirken, doğru özyinelemeli kuralda, tüm bildirim dizisi ayrıştırılmalı ve sonra çözülecektir - bu, çok büyük bir dizi durumunda ayrıştırıcı iç yığını için taşmaya neden olabilir. Sanırım birbirleriyle değiştirilebilirler, fark, doğru özyinelemeli kuralların, taşma ve derleme hatasına neden olabilecek LR ayrıştırıcısı için ek yük ekleyeceğidir. –

cevap

6

Bu C++ 's C mirasının bir mavisidir. C dilbilgisi (neredeyse) LALR(1)'dur ve bu nedenle left recursion'u mümkün olduğunca kullanır. C++ dilbilgisi artık belli belirsiz bir LALR değildir, ancak kuralların çoğu hala bir LALR ayrıştırıcısının tercih ettiği biçimde yazılmıştır, çünkü bunları değiştirmek için bir neden yoktur - C++ işlemek için yeterince güçlü herhangi bir ayrıştırıcı algoritması sözdizimsel özyineleme kullanılır. Bir LR ayrıştırıcısı için

İlgili konular