(Я достаточно новичок в Лиспе, чтобы не знать, как это сделать, но достаточно знаком, чтобы знать, что должно быть простым способом.)
Я был заинтригован недавно прочитанной статьей, в которой предлагалось хранить файлы журналов в виде S-выражений в стиле Lisp, чтобы файлы журналов можно было легко преобразовать в DSL. Это заставило меня задуматься о подобных грамматиках для других DSL, но я столкнулся с загадкой.
Синтаксический анализ s-выражений, в которых разделители являются круглыми скобками, прост
"(my-function foo bar)"
можно прочитать из файла / потока и оценить тривиально.
И если XML на самом деле является просто S-выражением, разве не должно быть простого способа преобразования чего-либо столь же простого, как
<function>foo bar etc-1 etc-2</function>
в
(function foo bar etc-1 etc-2)
Я могу подделать это поведение с помощью методов манипуляции со строками (черт возьми, регулярное выражение может позаботиться об этом, правда). Но это похоже на богохульство Лиспа - это всего лишь S-выражения! То же самое относится и к версиям lex / yacc на основе Lisp - я вижу необходимость в более сложном синтаксисе, но на самом деле это всего лишь синтаксис Lisp, замаскированный менее эффективным способом.
Теоретически это должно распространяться не только на XML, но и на любую контекстно-свободную грамматику, которая является гомоморфизмом грамматики Лиспа. (Я знаю, что Лисп, по-видимому, не полностью определяется грамматикой без контекста, такой же простой, как S-выражение, но, очевидно, последнее является строгим подмножеством первого, поэтому мое утверждение остается в силе).
Итак, вкратце: Существует ли простой способ определить синтаксис для неконтекстной грамматики, гомоморфной S-выражениям (например, XML), и проанализировать эту грамматику в Лиспе (или DSL на основе Lisp)?