Разбор S-выражений с произвольными разделителями в LISP - PullRequest
3 голосов
/ 01 марта 2012

(Я достаточно новичок в Лиспе, чтобы не знать, как это сделать, но достаточно знаком, чтобы знать, что должно быть простым способом.)

Я был заинтригован недавно прочитанной статьей, в которой предлагалось хранить файлы журналов в виде 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)?

Ответы [ 2 ]

3 голосов
/ 01 марта 2012

Да, вы можете сделать это, внедрив в макросе lisp «читательские макросы», которые возьмут ваш XML и преобразуют их в S-expr. Однажды в S-expr все просто в мире LISP.

Пример: http://www.agentsheets.com/lisp/XMLisp/

0 голосов
/ 02 марта 2012

Возможно, можно проанализировать XML с помощью макроса читателя , но я не знаю, кто это сделал.

S-XML - это простой XMLсинтаксический анализатор и компоновщик, но, если я помню, он не использует макросы чтения.

Частично причина, по которой макросы чтения не использовались для окончательного решения этой проблемы, заключается в том, что XML на самом деле, несмотря на первоначальные появления, действительно сложно .

...