2012-01-29 61 views
0

官方問題:需要幫助編寫Java方法來執行遞歸下降解析

編寫Java方法來執行以下生產的遞歸下降解析:

<repeat_statement> -> REPEAT <statement> UNTIL <expression> ; 

這就是我想出:

void repeatStatement() { 
    if(token == REPEAT) { 
     token = getNextToken(); 
     if(parseStatement()) { 
      if(token == UNTIL) { 
       token = getNextToken(); 
       if(parseExpression()) { 
        if(token == ;) { 
         return true 
        } 
       } 
      } 
     } return false 
    } 

我很有信心,我有一般的想法在這裏,但我希望有人能幫助我擦亮這個/確認我在正確的軌道上.. 先進的感謝!

回答

2

它看起來(隱約)就像你正在試圖評估重複聲明。這不是遞歸下降解析的問題。我期望像這樣(僞代碼):

RepeatStatement repeat_statement() throws ParseException { 
    if (!consume("REPEAT")) { 
     throw new ParseException("no REPEAT token"); 
    } 
    Statement statement = statement(); 
    if (!consume("UNTIL")) { 
     throw new ParseException("no UNTILtoken"); 
    } 
    Expression expression = expression(); 
    if (!consume(";")) { 
     throw new ParseException("no closing semicolon"); 
    } 
    return new RepeatStatement(statement, expression); 
} 
+0

hm好吧......我想我是一個(哈哈)非基地。謝謝您的幫助! – tommy1370 2012-01-29 21:02:51

+0

你介意看看我發佈的新代碼嗎?我試圖做一些更多的研究,並認爲我可能想出了一些中途體面的東西...... – tommy1370 2012-01-29 21:42:40

+0

@ tommy1370 - 我認爲'token'是某種全局變量。您需要決定在進入分析方法時,「token」是預期表達式的第一個標記還是最後一個標記(如果有)。現在你的方法假設前者在進入之前和在調用parseStatement()和parseExpression()之前,但在末尾以分號留下「token」。據推測,調用方法可以彌補這一點。另外,你的方法被聲明爲「void」,但你試圖返回一個布爾值。 – 2012-01-29 22:13:27