Grammar Reference
The complete BNF grammar for Ceramic, organized by chapter.
- Regular expressions use
/slashes/with Perl/xsyntax (whitespace inside is insignificant). - Literal strings are written in
"quotation marks".
Tokenization
Whitespace
ws -> /[ \t\r\n\f]+/
Comments
Comment -> "/*" /.*?/ "*/"
| "//" /.*$/
Identifiers
Identifier -> !Keyword, /[A-Za-z_?][A-Za-z_0-9?]*/
Integer Literals
IntToken -> "0x" HexDigits | DecimalDigits
HexDigits -> /([0-9A-Fa-f]_*)+/
DecimalDigits -> /([0-9]_*)+/
Floating-Point Literals
FloatToken -> "0x" HexDigits ("." HexDigits?)? /[pP] [+-]?/ DecimalDigits
| DecimalDigits ("." DecimalDigits?)? (/[eE] [+-]?/ DecimalDigits)?
Character Literals
CharToken -> "'" CharChar "'"
CharChar -> /[^\\']/
| EscapeCode
EscapeCode -> /\\ ([nrtf\\'"0] | x [0-9A-Fa-f]{2})/
String Literals
StringToken -> "\"" StringChar* "\""
| "\"\"\"" TripleStringChar* "\"\"\""
StringChar -> /[^\\"]/ | EscapeCode
TripleStringChar -> /(?!=""" ([^"]|$)) [^\\]/ | EscapeCode
Compilation Strategy
Pattern Matching
Pattern -> AtomicPattern PatternSuffix?
AtomicPattern -> Literal | PatternNameRef
PatternNameRef -> DottedName
PatternSuffix -> "[" comma_list(Pattern) "]"
Modules & Source Layout
Source File Layout
Module -> Import* ModuleDeclaration? TopLevelLLVM? TopLevelItem*
List Syntactic Forms
comma_list(Rule) -> (Rule ("," Rule)* ","?)?
variadic_list(Rule, LastRule) -> Rule ("," Rule)* ("," (LastRule)?)?
| LastRule
| nil
Conflict Resolution
Import -> Visibility? "import" DottedName ImportSpec? ";"
ImportSpec -> "as" Identifier
| "." "(" comma_list(ImportedItem) ")"
| "." "*"
DottedName -> Identifier ("." Identifier)*
ImportedItem -> Visibility? Identifier ("as" Identifier)?
Module Declaration
ModuleDeclaration -> "in" DottedName AttributeList? ";"
AttributeList -> "(" ExprList ")"
Top-Level LLVM
TopLevelLLVM -> LLVMBlock
LLVMBlock -> "__llvm__" "{" /.*/ "}"
Pattern Guards
PatternGuard -> "[" comma_list(PatternVar) ("|" Expression)? "]"
PatternVar -> Identifier | ".." Identifier
Visibility Modifiers
Visibility -> "public" | "private"
Type Definitions
Computed Layouts
Record -> PatternGuard? Visibility? "record" TypeDefinitionName RecordBody
TypeDefinitionName -> Identifier PatternVars?
PatternVars -> "[" comma_list(PatternVar) "]"
NormalRecordBody -> "(" comma_list(RecordField) ")" ";"
ComputedRecordBody -> "=" comma_list(Expression) ";"
RecordField -> Identifier TypeSpec
TypeSpec -> ":" Pattern
Extending Variants
Variant -> PatternGuard? Visibility? "variant" TypeDefinitionName ("(" ExprList ")")? ";"
Instance -> PatternGuard? "instance" Pattern "(" ExprList ")" ";"
Enumerations
Enumeration -> Visibility? "enum" Identifier "(" comma_list(Identifier) ")" ";"
Function Definitions
Simple Function Definitions
Function -> PatternGuard? Visibility? CodegenAttribute?
Identifier Arguments ReturnSpec? FunctionBody
Universal Overloads
Define -> PatternGuard? "define" Identifier (Arguments ReturnSpec?)? ";"
Overload -> PatternGuard? CodegenAttribute? "overload"
Pattern Arguments ReturnSpec? FunctionBody
Static Arguments
Arguments -> "(" ArgumentList ")"
ArgumentList -> variadic_list(Argument, VarArgument)
Argument -> NamedArgument | StaticArgument
NamedArgument -> ReferenceQualifier? Identifier TypeSpec?
VarArgument -> ReferenceQualifier? ".." Identifier TypeSpec?
StaticArgument -> "static" Pattern
ReferenceQualifier -> "ref" | "rvalue" | "forward"
Named Return Values
ReturnSpec -> ReturnTypeSpec | NamedReturnSpec
ReturnTypeSpec -> ":" ExprList
NamedReturnSpec -> "-->" comma_list(NamedReturn)
NamedReturn -> ".."? Identifier ":" Expression
Inline LLVM Functions
FunctionBody -> Block | "=" ReturnExpression ";" | LLVMBlock
LLVMBlock -> "__llvm__" "{" /.*/ "}"
Diagnostic Attributes
Attributes -> "[[" Identifier ("," Identifier)* "]]"
External Attributes
ExternalFunction -> Visibility? "external" AttributeList?
Identifier "(" ExternalArgs ")"
":" Type? (FunctionBody | ";")
ExternalArgs -> variadic_list(ExternalArg, "..")
ExternalArg -> Identifier TypeSpec
Global Aliases
GlobalAlias -> PatternGuard? Visibility?
"alias" Identifier PatternVars? "=" Expression ";"
Global Variables
GlobalVariable -> PatternGuard? Visibility?
"var" Identifier PatternVars? "=" Expression ";"
External Variables
ExternalVariable -> Visibility? "external" AttributeList? Identifier TypeSpec ";"
Statements
Blocks
Block -> "{" (Statement | Binding | LabelDef)* "}"
LabelDef -> Identifier ":"
Return by Reference
ReturnStatement -> "return" ReturnExpression? ";"
ReturnExpression -> ReturnKind? ExprList
ReturnKind -> "ref" | "forward"
alias: call-by-name binding
Binding -> BindingKind comma_list(Identifier) "=" ExprList ";"
BindingKind -> "var" | "ref" | "forward" | "alias"
Initialization Statements
Assignment -> ExprList AssignmentOp ExprList ";"
AssignmentOp -> "=" | "+=" | "-=" | "*=" | "/=" | "%=" | "<--"
switch
IfStatement -> "if" "(" Expression ")" Statement ("else" Statement)?
SwitchStatement -> "switch" "(" Expression ")"
("case" "(" ExprList ")" Statement)*
("else" Statement)?
..for: Multiple-Value For
WhileStatement -> "while" "(" Expression ")" Statement
ForStatement -> "for" "(" comma_list(Identifier) "in" Expression ")" Statement
MultiValueForStatement -> ".." "for" "(" Identifier "in" ExprList ")" Statement
goto
BreakStatement -> "break" ";"
ContinueStatement -> "continue" ";"
GotoStatement -> "goto" Identifier ";"
finally and onerror
ThrowStatement -> "throw" Expression ";"
TryStatement -> "try" Block ("catch" "(" (Identifier (":" Type)?) ")" Block)+
ScopeGuardStatement -> ScopeGuardKind Statement
ScopeGuardKind -> "finally" | "onerror"
Eval Statements
EvalStatement -> "eval" ExprList ";"
Expressions
Lambda Expressions
Lambda -> LambdaArguments LambdaArrow LambdaBody
LambdaArguments -> ".."? Identifier | Arguments
LambdaArrow -> "=>" | "->"
LambdaBody -> Block | ReturnExpression