Есть ли языковая спецификация для clojure? - PullRequest
20 голосов
/ 11 октября 2010

Есть ли языковая спецификация для clojure? Что-то, что точно определяет лексический синтаксис и грамматику в EBNF или что-то подобное?

Самым близким, что я смог найти, является веб-сайт clojure , но он не совсем соответствует требованиям языковой спецификации (несмотря на то, что это абсолютно замечательный ресурс). Если спецификации нет, упомянул ли наш BDFL какие-либо планы на нее?

Ответы [ 4 ]

17 голосов
/ 13 июля 2014

Грамматика , связанная с помощью fogus , которая была в плагине Eclipse Против часовой стрелки , больше не используется этим проектом и была удалена из него.

Clojure.g4, грамматика ANTLR

Для более современной грамматики ANTLR для Clojure см. Clojure.g4 ( постоянная ссылка )из grammars-v4 , коллекция «грамматик, написанных для ANTLR v4».Clojure.g4 является небольшим и легким для чтения, и он успешно проанализировал Compojure и clojure.core в прошлом, но это не гарантирует, что он может правильно анализировать весь код Clojure.

Парсер Clojure, LispReader.java

Наиболее авторитетная спецификация синтаксиса Clojure - исходный код Clojure .Clojure не использует абстрактную грамматику, только пользовательский парсер, но вы можете понять грамматику после тщательного изучения реализации парсера.Вот синтаксический анализатор Clojure: LispReader.java ( постоянная ссылка ).

LispReader.java использует несколько классов из других файлов в тот же каталог , например LineNumberingPushbackReader, но большая часть кода находится в этом файле.В LispReader основной функцией является read.read использует isWhitespace для игнорирования пробелов и запятых.Он также обнаруживает числа и передает анализ в readNumber.Для большинства других символов, таких как ( и #, read, не нужно интерпретировать объекты в массивах macros и dispatchMacros .Оттуда вы можете следовать коду.

clojure.tools.reader, синтаксический анализатор, написанный на Clojure

Существует также переопределение Clojure LispReader.java, называемое clojure.tools.reader . Его исходный код может быть проще для чтения, чем LispReader, поскольку он написан на Clojure, а не на Java.У clojure.tools.reader есть отличия от LispReader.java, которые в основном способны читать некоторые незначительные дополнительные синтаксисы, предложенные для Clojure, и лучше обрабатывать ошибки.

15 голосов
/ 11 октября 2010

Это самая близкая вещь к официальному EBNF Clojure, которую вы, вероятно, найдете.

https://github.com/laurentpetit/ccw/blob/3738a4fd768bcb0399630b7f6a6427a3066bdaa9/clojure-antlr-grammar/src/Clojure.g

6 голосов
/ 11 октября 2010

Нет спецификации языка. Если есть планы на будущее, я не слышал о них.

0 голосов
/ 19 марта 2019

Давайте рассмотрим синтаксическую ошибку или две:

user=> (defn)
Syntax error macroexpanding clojure.core/defn at (REPL:1:1). 
() - failed: Insufficient input at: [:fn-name] spec: :clojure.core.specs.alpha/defn-args 

И

user=> (fn [3]) Syntax error macroexpanding clojure.core/fn at (REPL:1:1).
(3) - failed: Extra input at: [:fn-tail :arity-1 :params] spec: :clojure.core.specs.alpha/param-list
3 - failed: vector? at: [:fn-tail :arity-n :params] spec: :clojure.core.specs.alpha/param-list

Понятно, что синтаксис основных макросов теперь (версия 1.10) проверяется с помощью clojure.spec.Если и когда проект Clojure в Clojure продвинется, мы можем ожидать, что spec расширит область его действия до самого компилятора.

Дело в том, что spec имеет полную мощность EBNF, поэтому исходный код будет содержать полную EBNF языка.Обозначения объясняются в Clojure - clojure.spec: Обоснование и обзор :

Последовательности

Спецификации для последовательностей / векторов используют набор стандартных операторов регулярных выраженийсо стандартной семантикой регулярных выражений:

cat - a concatenation of predicates/patterns

alt - a choice of one among a set of predicates/patterns

* - zero or more occurrences of a predicate/pattern

+ - one or more

? - one or none

& - takes a regex op and further constrains it with one or more predicates

Когда это произойдет?У меня (совершенно неосведомленное) впечатление, что основная команда тонет в аллигаторах и почти забыла свое первоначальное намерение осушить это болото.


Предыдущий ответ, относящийся к spec в общих терминах для Clojure 1.9, был удален.Я думаю, что его использование для определения и проверки синтаксиса макросов является новым с 1.10.

...