2012-03-01 59 views
3

(我足夠多的新爲Lisp不知道如何做到這一點,但也足夠熟悉知道那裏只是必須是一個簡單的方法。)解析S-表達與LISP任意分隔符

我我最近閱讀的一篇文章感興趣,它主張將日誌文件存儲爲Lisp風格的S表達式,以便日誌文件可以輕鬆轉換爲DSL。這讓我想到了其他DSL的類似語法,但我碰到了一個問題。

解析s表達式,其中定界符是括號容易

"(my-function foo bar)" 

可以從文件/流被讀取和平凡評價。

如果XML是真的只是一個S-表達,不應該有轉變爲

<function>foo bar etc-1 etc-2</function> 

簡單的東西到

(function foo bar etc-1 etc-2) 

我可以僞造這種行爲有一個簡單的方法字符串操作技術(heck,真正的正則表達式可以處理這個問題)。但是,這看起來像Lisp褻瀆 - 這些只是S表達!這同樣適用於lex/yacc的基於Lisp的版本 - 我可以看到需要更復雜的語法,但實際上,這只是以較低效率的方式僞裝的Lisp語法。

理論上,這應該超越XML,擴展到任何與Lisp語法同態的上下文無關文法。 (我知道Lisp並沒有被上下文無關的語法完全定義爲與S表達式一樣簡單,但顯然後者是前者的嚴格子集,所以我的陳述仍然存在)。

因此,簡而言之:有沒有一種簡單的方法來定義一個上下文無關文法同態到S-表達式(如XML,例如)的語法和解析內Lisp的是語法(或Lisp的基礎DSL)?

+1

是什麼問題? – 2012-03-01 05:15:11

+0

我認爲這是暗示的,但也許不清楚,因爲我沒有把它作爲一個問題來描述。編輯澄清它(最後)。 – chimeracoder 2012-03-01 05:24:58

回答

3

是的,你可以通過在lisp中實現「reader宏」來完成這個工作,它將把你的XML轉換成S-expr。一旦進入S-expr,在LISP世界中一切都很簡單。

例:http://www.agentsheets.com/lisp/XMLisp/

0

可能可以與reader macros解析XML,但我不知道的人已經這樣做了。

S-XML是一個簡單的XML解析器和構建器,但如果我記得它不使用讀取器宏。

讀者宏的部分原因並未被用來解決這個問題,最終的結果是儘管最初出現了XML,但實際上,XML是really complicated