(我已经足够新了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)
我可以用字符串操作技术伪造这种行为(哎呀,正则表达式可以解决这个问题,真的)。但这似乎是Lisp亵渎 - 这些只是S表达式!这同样适用于基于Lisp的lex / yacc版本 - 我可以看到需要更复杂的语法,但实际上,这只是以低效方式伪装的Lisp语法。
理论上,这应该超越XML,扩展到任何无上下文语法,这是Lisp语法的同态。 (我知道Lisp被认为没有完全由无上下文语法定义,就像S表达式一样简单,但显然后者是前者的严格子集,所以我的陈述仍然存在)。
所以,简而言之:是否有一种简单的方法可以定义无上下文语法的语法,与S表达式(例如XML)同态,并在Lisp中解析该语法(或一个基于Lisp的DSL)?
答案 0 :(得分:3)
是的,你可以通过在lisp中实现“reader macros”来实现这一点,它将获取你的XML并将它们转换为S-expr。一旦进入S-expr,LISP世界中的一切都很简单。
答案 1 :(得分:0)
有可能用reader macros解析XML,但我不知道有人这样做过。
S-XML是一个简单的XML解析器和构建器,但如果我记得它不使用读取器宏。
读者宏未被用于解决此问题的部分原因是,尽管初始出现了really complicated,但事实上XML仍然存在。