2012-03-01 21 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