2015-03-30 20 views
6

Yani şu dilbilgisine sahip olduğumu söyleyelim:Çocuk düğümlerini nasıl ayrıştırırım?

let_stat = "let" iden [ "=" expr ]; 
if_stat = "if" expr "->" stat; 
stat = let_stat | if_stat; 

Aşağıdaki psuedo-ish kodu:

let_stat parseLetStat() { 


if token is "let" { 
     consume token 

     if token is identifier { 
      char *value = consumetoken.value 
      let_stat let = new let_stat; 
      let.name = value; 

      if token is "=" { 
       let.value = parseExpression; 
      } 

      return let 
     } 
    } 
} 

if_stat parseIfStat() { 
    if token is "if" { 
     consume token 

     expression expr = parseExpression; 
     block block = parseBlock; 

     if_stat ifstmt = new if_stat 
     ifstmt.expr = expr 
     ifstmt.block = block 
     return ifstmt 
    } 
} 

stat parseStatement() { 

} 

parseStatement işlevi ne yapar? Hangi işlevi çağırmak, if_stat işlevi veya let_stat işlevi nasıl seçilir? Yoksa tüm kodu tek bir fonksiyona atabilir miyim? Tam olarak anlamadım, kafam karıştığından beri herhangi bir yardım harika olurdu.

cevap

1

Özgül sorun önemli bir konu münavebe bir EBNF kuralında varken, nonterminal için ayrıştırıcı tüm alternatifleri çağırmalıdır ve yapısını tanıması halinde her sormak olmasıdır; Her altparser, evet veya hayır gösteren bir bayrak döndürmek zorundadır. muhtemelen gerekenler

general principles for writing a recursive descent parser.

+0

Ah Anlıyorum, mükemmeldir. Ve tabii ki, tek ve sadece Ira Baxter cevapladı, benim sorularımın birçoğuna cevap veriyor gibisiniz :) Teşekkürler! :) –

+0

@ user3839220: Benim bölgem hakkında sorular soruyorsun: -} –

İlgili konular