2015-03-30 4 views
6

Так позволяет сказать, у меня есть следующая грамматика:Как разобрать дочерние узлы?

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

Это будет следующим псевдо-иш код:

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 делать? Как он будет выбирать, какую функцию вызывать, функцию if_stat или функцию let_stat? Или я бы бросил весь код в одну функцию? Я не совсем понимаю, любая помощь будет великолепной, так как я смущен.

ответ

1

Ключевой проблемой для вашей конкретной проблемы является то, что при чередовании в правиле EBNF синтаксический анализатор для нетерминала должен вызывать все альтернативы и задавать каждый из них, если он распознает конструкцию; каждый подпараметр должен вернуть флаг, указывающий «да» или «нет».

То, что вы, вероятно, нужны general principles for writing a recursive descent parser.

+0

О, я вижу, совершенен. И, конечно, ответила одна и единственная Ира Бакстер, ты, кажется, отвечаешь на многие мои вопросы :) Спасибо! :) –

+0

@ user3839220: Вы задаете вопросы на моем торфе: -} –

Смежные вопросы