preserves/schema/schema.prs

93 lines
2.4 KiB
Plaintext

@<EmacsMode "-*- preserves -*-">
# TODO: some kind of constants
# TODO: rename "version" to "schema-version" ?
version 1 .
Bundle = <bundle @modules Modules>.
Modules = { ModulePath: Schema ...:... }.
Schema = <schema {
version: Version
embeddedType: EmbeddedTypeName
definitions: Definitions
}>.
# version 1 .
Version = 1 .
EmbeddedTypeName = #f / Ref .
Definitions = { symbol: Definition ...:... }.
Definition =
# Pattern / Pattern / ...
/ <or [@pattern0 NamedAlternative @pattern1 NamedAlternative @patternN NamedAlternative ...]>
# Pattern & Pattern & ...
/ <and [@pattern0 NamedPattern @pattern1 NamedPattern @patternN NamedPattern ...]>
# Pattern
/ Pattern
.
Pattern = SimplePattern / CompoundPattern .
SimplePattern =
# any
/ =any
# special builtins: bool, double, int, string, bytes, symbol
/ <atom @atomKind AtomKind>
# matches an embedded value in the input: #:p
/ <embedded @interface SimplePattern>
# =symbol, <<lit> any>, or plain non-symbol atom
/ <lit @value any>
# [p ...] ----> <seqof <ref p>>; see also tuplePrefix below.
/ <seqof @pattern SimplePattern>
# #{p} ----> <setof <ref p>>
/ <setof @pattern SimplePattern>
# {k: v, ...:...} ----> <dictof <ref k> <ref v>>
/ <dictof @key SimplePattern @value SimplePattern>
# symbol, symbol.symbol, symbol.symbol.symbol, ...
/ Ref
.
CompoundPattern =
# <label a b c> ----> <rec <lit label> <tuple [<ref a> <ref b> <ref c>]>>
# except for record labels
# <<rec> x y> ---> <rec <ref x> <ref y>>
/ <rec @label NamedPattern @fields NamedPattern>
# [a b c] ----> <tuple [<ref a> <ref b> <ref c>]>
/ <tuple @patterns [NamedPattern ...]>
# [a b c ...] ----> <tuplePrefix [<ref a> <ref b>] <seqof <ref c>>>
# TODO: [@fixed0 NamedPattern @fixedN NamedPattern ...]
/ <tuplePrefix @fixed [NamedPattern ...] @variable NamedSimplePattern>
# {a: b, c: d} ----> <dict {a: <ref b>, c: <ref d>}>
/ <dict @entries DictionaryEntries>
.
DictionaryEntries = { any: NamedSimplePattern ...:... }.
AtomKind = =Boolean / =Double / =SignedInteger / =String / =ByteString / =Symbol .
NamedAlternative = [@variantLabel string @pattern Pattern].
NamedSimplePattern = @named Binding / @anonymous SimplePattern .
NamedPattern = @named Binding / @anonymous Pattern .
Binding = <named @name symbol @pattern SimplePattern>.
Ref = <ref @module ModulePath @name symbol>.
ModulePath = [symbol ...].