2013-05-27 53 views
2

我有一個非常簡單的語言。函數被定義爲一些註釋(由以分號開頭的行表示),後跟一個函數名稱(一個單詞後跟parens),其後是其他任何內容,並以「q」結尾。這是一個解析-EZ功能:在Clojure中用行號解析語言

(defn routine [] 
(multi* (regex #";.*") 
(regex #"(\w+)\(.*\).*" 1) 
(multi* (regex #"[^q].*")) 
(regex #"q.*")) 

這可以工作,但我想返回不同模式匹配的行號。有沒有辦法做到這一點,或者我需要寫我自己的解析器?

就目前來看,我的語言很簡單,寫一個新的解析器不會太重要,但是會隨着複雜性的增加而受到限制。

+0

是您寫一個新的語言或學習如何進球寫一個解析器?如果它是前者,那麼你可以使用這裏列出的幾個庫中的一個:http://www.clojure-toolbox.com/如果你的目標是學習*如何編寫一個解析器,而不是去做。 – noahlz

+0

@noahz:我只想使用一個解析器,沒有興趣寫一個。你知道那裏列出的解析器是否支持行號嗎?它似乎沒有像我一樣。 – Xodarap

+2

[parsley](https://github.com/cgrand/parsley)和[instaparse](https://github.com/Engelberg/instaparse)是兩個解析庫。他們都有創建的問題([insta](https://github.com/Engelberg/instaparse/issues/8),[parsley](https://github.com/cgrand/parsley/issues/4))請求用於解析結果的行和列元數據。 我使用的這兩個庫中唯一一個是** parsely **,它實際上保留了解析結果中的所有原始文本,所以你可以通過解析樹尋找'\ n'並計算行併爲每個符號列。 –

回答

2

parse-ez中有一個「line-pos」函數。你不能使用它嗎?

線-POS DOC:

「返回[行列]代表當前光標所在位置的解析器 矢量」