3

(我对 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)中解析该语法?

4

2 回答 2

3

是的,您可以通过在 lisp 中实现“阅读器宏”来做到这一点,它将获取您的 XML 并将它们转换为 S-expr。一旦进入 S-expr,在 LISP 世界中一切都很简单。

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

于 2012-03-01T06:20:29.793 回答
0

可能可以使用阅读器宏解析 XML,但我不知道有人这样做过。

S-XML是一个简单的 XML 解析器和构建器,但如果我记得它不使用阅读器宏。

阅读器宏没有被用来最终解决这个问题的部分原因是 XML 实际上,尽管最初看起来很复杂

于 2012-03-01T20:14:38.903 回答