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