2015-03-30 132 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

哦,我明白了,完美。當然,從唯一的艾拉巴克斯特回答,你似乎回答了很多我的問題:)謝謝! :) – 2015-03-30 18:57:06

+0

@ user3839220:您在我的草坪上提問: - } – 2015-03-30 22:27:41