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 式です! 同じことが、lex/yacc の Lisp ベースのバージョンにも当てはまります。より複雑な構文が必要であることは理解できますが、実際には、これは非効率的な方法で偽装された 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 パーサーおよびビルダーですが、思い出すとリーダー マクロを使用していません。

この問題を決定的に解決するためにリーダー マクロが使用されていない理由の 1 つは、XML が実際には、最初の外観とは異なり、非常に複雑だからです。

于 2012-03-01T20:14:38.903 に答える