2011-05-12 56 views
15

我希望我的語言有兩個功能,使蟒蛇般的壓痕Python這樣一個很好的格式化語言:如何做彎曲/野牛

  • 每行一個聲明
  • 塊與另一縮進級別開始並繼續下去,直到結束

任何人都可以給我一個關於如何實現與flex/bison類似的工具,如何實現該提示?這種功能強制用戶編寫可讀代碼。

回答

6

我認爲沒有辦法只用lex/yacc來製作一個python-like語法分析器,因爲lex/yacc只能處理上下文無關文法,但是python-like語法是上下文敏感的。

的原因是,如果你想找到一個聲明,前一個是同一塊,你應該讓這種說法知道前一個缺口,那就是環境。

我建議你除了法/ yacc的一些額外的邏輯來實現這一點,而不會那麼辛苦了。您可以在「語法」模塊中閱讀代碼here

的關鍵是,讓法/ yacc的部分解析單個語句,與縮進級別,並且寫的東西包裝陳述成塊。

+0

說,用Haskell的'Parsec'這樣做會更容易嗎?我聽說它不僅僅是上下文無關的。 – Lanbo 2011-05-17 17:04:26

15

您可以嘗試跟蹤詞法分析器縮進級別,並添加僞令牌縮進和取消縮進。您需要保留已經看到的縮進級別堆棧,並且需要關注空白/僅限註釋的行。但我擔心,詞法分析器最終會變成一個難以維護的混亂,並且在詞法分析器中還有一些特定於語法分析的狀態(縮進堆棧)。

+2

可惜我只能標記一個作爲答案。謝謝,您的意見對我有很大的幫助。 – Lanbo 2011-05-14 06:47:00