Syntax for Lisp.re

November 7, 2018 · View on GitHub

This grammar is displayed using a syntax similar to regular expressions.

  • and "thick parenthesis" indicate grouping, to distinguish from parenthesis that are actually part of the grammar
  • + allows one or more of the preceeding term or group
  • * allows zero or more of the preceeding term or group
  • ? allows zero or one of the preceeding term or group

Note that this sacrifices a bit of precision in the interest of readability. For the source of truth, read the source code :D

If you're interested, take a look at the grammar definition

Structure

Forms that are valid at the top level of a file or module

NameSyntax
open(open longCap)
def(def Pattern Expression)
defn(defn lowerIdent FnArgs Expression*)
def_rec(def-rec Pattern Expression+)
type(type TypeName TypeKind+)
module(module capIdent Structure+)
module_alias(module-alias capIdent longCap)
external(external lowerIdent CoreType string+)
decorator_nopayload(@decoratorName Structure)
decorator(@decoratorName Structure Structure)
evalExpression

Expression

NameSyntax
identlongIdent
constconstant
unit()
constructor(longCap Expression+)
empty_constrlongCap
constructor_poly(`capIdent Expression+)
empty_poly`capIdent
attribute:longIdent
opoperator
tuple(, Expression Expression+)
array_literal[|Expression*|]
list_literal[Expression* ⦅...Expression?]
object_literal{⦅...Expression? ObjectItem*}
let(let [Pattern Expression+] Expression*)
do(do Expression*)
assert(assert Expression)
lazy(lazy Expression)
open(open longCap Expression*)
if(if Expression Expression Expression?)
module_pack(module ModuleExpr)
module(module capIdent ModuleExpr Expression*)
arrow(=> FnArgs Expression*)
threading_last(->> Expression ThreadItem*)
threading(-> Expression ThreadItem*)
threading_as(as-> Expression Pattern Expression*)
switch(switch Expression Pattern ⦅when Expression? Expression+)
switch_function(switch _ Pattern ⦅when Expression? Expression+)
try(try Expression Pattern ⦅when Expression? Expression+)
array_index([Expression] Expression)
js_object_attribute(string Expression)
setField(<- :longIdent Expression Expression)
record_attribute(:longIdent Expression)
fn_call(Expression FnCallArg*)
constraint(: Expression CoreType)

Pattern

NameSyntax
identlowerIdent
intervalconstant..constant
constantconstant
unit()
ignored_
array[Pattern* ⦅...Pattern?]
tuple(, Pattern Pattern+)
empty_constrlongCap
poly(`capIdent Pattern+)
empty_poly`capIdent
exception(exception Pattern)
constructor(longCap Pattern+)
object{PatternObjectItem+}
or(| Pattern+ )

ModuleExpr

NameSyntax
structure(str Structure*)
identlongCap

TypeName

NameSyntax
vbl(lowerIdent typeVariable+)
plainlowerIdent

TypeKind

NameSyntax
record{TypeObjectItem+}
constructorsTypeConstructor+
aliasCoreType

TypeObjectItem

NameSyntax
normal:lowerIdent CoreType
punned:lowerIdent

TypeConstructor

NameSyntax
no_argscapIdent
args(capIdent CoreType+)

CoreType

NameSyntax
constr_no_argslongIdent
variabletypeVariable
constructor(longIdent CoreType+)
arrow(=> [CoreType+] CoreType)

typeVariable

A type variable

'lowerIdent

FnCallArg

NameSyntax
labeled~lowerIdent=Expression
punned~lowerIdent
exprExpression

ThreadItem

NameSyntax
attribute:longIdent
identlongIdent
emptyconstrlongCap
constructor(longCap Expression+)
fn_call(Expression FnCallArg+)

ObjectItem

NameSyntax
normal:longIdent Expression
punned:longIdent

FnArgs

NameSyntax
singlelowerIdent
unit()
ignored_
multiple[FnArg+]

FnArg

NameSyntax
destructured~lowerIdent⦅:CoreType? as Pattern
optional~lowerIdent=?
defaulted~lowerIdent⦅:CoreType?=Expression
labeled~lowerIdent⦅:CoreType?
unlabeledPattern

PatternObjectItem

NameSyntax
normal:longIdent Pattern
punned:longIdent

longIdent

A potentially-namespaced lower-case identifier

longCap_.⦆?lowerIdent

longCap

A potentially-namespaced capital identifier

longCap_

longCap_

NameSyntax
dotlongCap_.capIdent
lidentcapIdent

decoratorChar_

NameSyntax
identchar
.
+
~

constant

NameSyntax
floatfloat
intint64
stringstring
longStringlongString
charchar

capIdent

A simple identifier starting with a capital letter

A…Zidentchar*

lowerIdent

A simple identifier starting with a lower-case letter

a…zidentchar*

identchar

NameSyntax
alpha
0…9
_

int64

An int constant

0…9+

float

A float constant

0…9+.0…9+

string

A string constant

"strchar*"

strchar

NameSyntax
\any
any

longString

Note: This doesn't yet support arbitrary heredoc delimiters. Just {| and |}

{|⦅any*|}

char

A char constant

'charchar'

charchar

NameSyntax
\any
any

reserved

NameSyntax
fun
let
and
as
type
switch
exception
external
of
module
rec
open
import
try
catch
from

alpha

NameSyntax
a…z
A…Z

operator

An operator

opChar+

reservedOps

NameSyntax
=>
->
->>
...

opChar

NameSyntax
!
$
%
&
*
+
-
.
/
<
=
>
?
@
^
|
~