2012-03-22 140 views
2

我寫一個解析器和在我的各種方法的代碼我的代碼非常類似:清理Ruby代碼

if @sym.type == TokenType::IDENT_TOKEN 
     next_token() 
     if @sym.type == TokenType::EQUALS_TOKEN 
     next_token() 
     if @sym.type == TokenType::NUMERAL_TOKEN 
      next_token() 
      const_a(keys | ConstList.follow) 
     else 
      error(keys | ConstA.first) 
     end 
     else 
     error(keys | ConstA.first) 
     end 
    else 
     error(keys | ConstA.first) 
    end 

這是很難在我看來,閱讀,看起來非常混亂,這不是慣用的Ruby代碼。有什麼方法可以將它壓縮並減少混亂?

任何幫助,將不勝感激。

+1

這些問題屬於[代碼評論](http://codereview.stackexchange.com/)。 – 2012-03-23 01:12:42

回答

2

那麼,你可以通過在成功解析之後執行nextreturn將所有的error方法調用摺疊爲一個調用,然後再陷入單個錯誤。

我認爲在編寫遞歸下降解析器時,您應該只接受一定程度的代碼爆炸。這只是他們的樣子。

你可以include一些常數定義模塊來擺脫範圍限定符。

+0

我不在上面的循環中,所以如果我調用'next',會發生什麼? – 2012-03-22 23:55:12

+0

但是你可以在下一個環中放置一個循環,或者製作一個方法,這樣'return'就可以工作。你也可以從'next_token'返回'true',這樣你可以用'&&'將測試串起來。你可以省略'()'。你可以定義一個方法來測試一個標記值,如果測試成功,就調用next_token。但是,真的,我認爲你的代碼不好。 RD分析器有點冗長。 – DigitalRoss 2012-03-23 00:04:05

+0

謝謝,這非常有幫助。 – 2012-03-23 00:11:36

2

如果應用了狀態機模式,您可能會很清楚地清除它。不僅閱讀起來會更容易,而且可以通過正確的工具生成解析器流程圖。

這就是Ragel這樣的工具如何構建解析器。

+0

使用你提到的模式會很好,但是這是爲了一個任務,並且有一些嚴格的參數可以和不能用作解決方案。儘管感謝您的評論。 – 2012-03-22 23:53:05

+1

如果是這樣的話,我會嘗試併發明「我無法相信它不是狀態機」模式,並使用它。 – tadman 2012-03-23 18:24:42