2012-05-05 117 views
2

我想爲Jade的子集編寫一個簡單解析器,生成一些XmlHtml以供進一步處理。解析器跳過行

該解析器非常簡單,但經常與Parsec,有點長。由於我不知道是否允許我製作這麼長的代碼帖子,因此我有完整的工作示例here

我已經涉足Parsec之前,但很少成功。現在,我不太明白爲什麼它似乎吞下了以下幾行。例如,

.foo.bar 
    | Foo 
    | Bar 
    | Baz 

玉輸入與parseTest tag txt測試,返回此:

Element {elementTag = "div", elementAttrs = [("class","foo bar")], elementChildren = [TextNode "Foo"]} 

我的解析器似乎能對付任何一種嵌套的,但從來沒有超過一行。我錯過了什麼?

回答

6

如果Parsec無法匹配剩餘的輸入,它將停止解析,並簡單地忽略該輸入。在這裏,問題是在分析了一個標籤之後,在下一個標籤之前,你不會在行的開頭消耗空白,所以Parsec不能解析剩餘的輸入和保存。 (可能還有其他問題,我現在無法測試代碼)

添加消耗空間的東西有很多種方法,但我不熟悉Jade,所以我不能告訴你哪種方式是「正確」的方式(我不知道縮進語法是如何工作的),但只需在tag末尾添加whiteSpace即可。

順便說一下,您應該考慮將解析器分解爲Lexer和Parser。 Lexer產生一個像[Ident "bind", OpenParen, Ident "tag", Equals, StringLiteral "longname", ..., Indentation 1, ...]這樣的令牌流,解析器解析該令牌流(是的,Parsec可以解析任何東西的列表)。我認爲這會讓你的工作更容易/更少混淆。

+0

使用令牌模塊通常習慣於與Parsec一起使用。但是,由於Jade顯然使用了空白區域,我認爲您建議編寫一個單獨的掃描程序是正確的,請參閱稍微過時的Parsec手冊的2.11節:http://research.microsoft.com/en-us /um/people/daan/download/parsec/parsec.pdf –

+0

不幸的是,我在'tag'和'tagP'解析器的周圍添加了空格,並且結果仍然是... – Lanbo

+0

@Scán - 雖然這是一個問題。由於Jade似乎對縮進非常敏感,因此您不能直接使用Parsec的'whiteSpace'或'lexeme'分析器,因爲它們會消耗所有的空白區域。縮進敏感的解析是相當先進的(有一些圖書館可以幫助Hackage - 我不知道它們有多麼有用或有何記錄)。如果你是Parsec /解析的新手,我建議選擇一種比Jade簡單一點的語言來練習一下。 –