Ответ 1
Это самая близкая вещь для официального EBNF Clojure, который вы, скорее всего, найдете.
Есть ли спецификация языка для clojure? Что-то, что точно определяет лексический синтаксис и грамматику в EBNF или что-то подобное?
Самое близкое, что я мог найти, это clojure веб-сайт, но на самом деле это не совсем соответствует требованиям спецификации языка (несмотря на то, что это абсолютно замечательный ресурс). Если спецификация отсутствует, наш BDFL упоминает о каких-либо планах на один?
Это самая близкая вещь для официального EBNF Clojure, который вы, скорее всего, найдете.
Грамматика связана fogus, которая находилась в плагине Eclipse против часовой стрелки, больше не используется этим проектом и удаляется из него. Если вы хотите получить более современную грамматику ANTLR для Clojure, см. Clojure.g4
(permalink) из grammars-v4, сборник "грамматики, написанные для ANTLR v4". Clojure.g4
мало и легко читается, и он успешно проанализировал Compojure и clojure.core
в прошлом, но это не гарантирует правильного анализа всего кода Clojure.
Наиболее авторитетной спецификацией синтаксиса Clojure s является Clojure s исходный код. Clojure не использует абстрактную грамматику, а только пользовательский парсер, но вы можете понять грамматику после тщательного изучения реализации парсеров. Вот параграф Clojure s: LispReader.java
(permalink).
Clojure s LispReader.java
использует несколько классов из других файлов в тот же каталог, например LineNumberingPushbackReader
, но большая часть кода находится в этом файле. В LispReader
основная функция read
. read
использует isWhitespace
, чтобы игнорировать пробелы и запятые. Он также обнаруживает числа и руки от разбора readNumber
. Для большинства других символов, таких как (
и #
, read
передает интерпретацию объектам в macros
и dispatchMacros
массивах. Вы можете следить за кодом.
Существует также Clojure повторная реализация LispReader.java
, называемая clojure.tools.reader, Его исходный код может быть легче читать, чем LispReader
, поскольку он находится в Clojure, а не в Java. clojure.tools.reader имеет некоторые отличия от LispReader.java
, которые в основном могут читать некоторые незначительные дополнительные синтаксисы, предложенные для Clojure и обработки ошибок лучше.
Нет языковой спецификации. Если в будущем есть какие-то планы, я не слышал о них.