2013-03-20 39 views
5

我正在用它自己的內置語言編寫一個類似於Python的工具。我想在語法中使縮進有意義(因此在行首的製表符和空格代表命令的嵌套)。如何在語法中使用類似Python的縮進來編寫語言?

這樣做的最好方法是什麼?

我寫過遞歸下降和有限自動機解析器。

+0

我建議你改變這個問題的標題,這是從列表頁面非常誤導。也許提起'off-side rule' – forivall 2013-03-20 19:30:19

+0

@forvall完成! :) – 2013-03-20 19:32:33

+1

目前的標題呢?我認爲它好多了! :) – ulidtko 2013-03-20 19:38:06

回答

5

使用一種叫做ASDL產生的電流CPython的解析器seems to be

關於你使用特殊的詞法要求,it's done壓痕令牌稱爲INDENTDEDENT。要複製這些內容,只需在詞法分析器中實現這些標記(如果使用堆棧來存儲先前縮進行的起始列,那麼這些標記非常容易),然後像往常一樣將它們插入語法中(就像任何其他關鍵字或運算符標記一樣) 。

+0

這很好......但我只想確定自己寫的正確技巧。 – 2013-03-20 19:27:33

+0

@oleg,請參閱上面鏈接的python文檔。他們使用兩個特殊的令牌INDENT和DEDENT。 – ulidtko 2013-03-20 19:30:31

+0

hm ...這是有道理的。我的壞我沒有想到它第一次:) – 2013-03-20 19:30:54

0

查看python compiler,特別是compiler.parse

+0

這不是關於python ...這是關於python語法的。它與它相似。命令不在python中。只是人類可讀的語言...... – 2013-03-20 19:18:32

0

我建議ANTLR任何詞法分析器/解析器代(http://www.antlr.org)。

此外,該網站(http://erezsh.wordpress.com/2008/07/12/python-parsing-1-lexing/)有一些更多的信息,特別是:

Python的縮進不能用DFA來解決。 (我仍然困惑於它是否可以用上下文無關的語法來解決)。

PyPy產生約詞法的Python有趣的訊息(他們打算它使用後處理詞法分析器輸出來解決)

CPython的的標記生成器被寫入C.它的Ad-Hoc,手寫,和 複雜。這是我知道的 Python lexing的唯一官方實現。

+1

前段時間我寫了一個簡單的C語言實現的解析器,它是遞歸下降解析器。我不需要複雜。它大約有30個命令。 – 2013-03-20 19:21:26