Skip to content

AddyScript Grammar

Here is the complete grammar for the AddyScript programming language, represented using railroad diagrams and Extended Backus-Naur Form (EBNF) notation.

Axiom

Program:

Program

Program ::= StatementWithLabels*

Non-terminal symbols

StatementWithLabels:

StatementWithLabels

StatementWithLabels ::= Label* Statement

Label:

Label

Label ::= IDENTIFIER ':'

Statement:

Statement

Statement ::= ImportDirective
            | ClassDefinition
            | FunctionDecl
            | ExternalFunctionDecl
            | ConstantDecl
            | VariableDecl
            | Block
            | IfElse
            | SwitchBlock
            | ForLoop
            | ForEachLoop
            | WhileLoop
            | DoLoop
            | Continue
            | Break
            | Goto
            | Yield
            | Return
            | Throw
            | TryCatchFinally
            | AssignmentWithLet
            | Expression ';'

ImportDirective:

ImportDirective

ImportDirective ::= 'import' QualifiedName ( 'as' IDENTIFIER )? ';'

QualifiedName:

QualifiedName

QualifiedName ::= IDENTIFIER ( '::' IDENTIFIER )*

ClassDefinition:

ClassDefinition

ClassDefinition ::= Attributes? MODIFIER? 'class' IDENTIFIER ( ':' IDENTIFIER )? '{' ClassMember* '}'

Attributes:

Attributes

Attributes ::= '[' Attribute ( ',' Attribute )* ']'

Attribute:

Attribute

Attribute ::= IDENTIFIER ( '(' ( Expression | ( Expression ',' )? VariableSetterList )? ')' )?

ClassMember:

ClassMember

ClassMember ::= MemberPrefix? MemberSpec

MemberPrefix:

MemberPrefix

MemberPrefix ::= Attributes? ( SCOPE MODIFIER? | MODIFIER SCOPE? )?

MemberSpec:

MemberSpec

MemberSpec ::= ConstructorSpec
             | FieldSpec
             | PropertySpec
             | MethodSpec
             | OperatorSpec
             | EventSpec

ConstructorSpec:

ConstructorSpec

ConstructorSpec ::= 'constructor' ParameterList (':' 'super' ArgumentList)? Block

ParameterList:

ParameterList

ParameterList ::= '(' ( Parameter ( ',' Parameter )* )? ')'

Parameter:

Parameter

Parameter ::= Attributes? ('&' | '..')? IDENTIFIER '!'? ('=' Literal)?

Literal:

Literal

Literal  ::= 'null'
           | BOOLEAN
           | INTEGER
           | BIG_INTEGER
           | FLOAT
           | BIG_DECIMAL
           | COMPLEX
           | DATE
           | STRING
           | BLOB

FieldSpec:

FieldSpec

FieldSpec ::= IDENTIFIER ( '=' Expression )? ';'

PropertySpec:

PropertySpec

PropertySpec ::= 'property' ( IDENTIFIER | '[]' ) (
    ( '=>' Expression )? ';'
    |
    '{' SCOPE? (
        'read' ( MethodBody SCOPE? 'write' )?
        |
        'write' ( MethodBody SCOPE? 'read' )?
    ) MethodBody '}'
)

MethodBody:

MethodBody

MethodBody ::= ( '=>' Expression )? ';' | Block

MethodSpec:

MethodSpec

MethodSpec ::= 'function' IDENTIFIER ParameterList MethodBody

OperatorSpec:

OperatorSpec

OperatorSpec ::= 'operator' OverloadableOperator ParameterList MethodBody

OverloadableOperator:

OverloadableOperator

OverloadableOperator ::= '+'
                       | '-'
                       | '++'
                       | '--'
                       | '~'
                       | '*'
                       | '/'
                       | '%'
                       | '#### '
                       | '&'
                       | '|'
                       | '^'
                       | '<<'
                       | '>>'
                       | '=='
                       | '!='
                       | '<'
                       | '>'
                       | '<='
                       | '>='
                       | 'startswith'
                       | 'endswith'
                       | 'contains'
                       | 'matches'

EventSpec:

EventSpec

EventSpec ::= 'event' ParameterList ';'

FunctionDecl:

FunctionDecl

FunctionDecl ::= Attributes? 'function' IDENTIFIER ParameterList FunctionBody

FunctionBody:

FunctionBody

FunctionBody ::= '=>' Expression ';' | Block

ExternalFunctionDecl:

ExternalFunctionDecl

ExternalFunctionDecl ::= Attributes? 'extern' 'function' IDENTIFIER ParameterList ';'

VariableSetterList:

VariableSetterList

VariableSetterList ::= VariableSetter ( ',' VariableSetter )*

VariableSetter:

VariableSetter

VariableSetter ::= IDENTIFIER '=' Expression

ConstantDecl:

ConstantDecl

ConstantDecl ::= 'const' VariableSetterList ';'

VariableDecl:

VariableDecl

VariableDecl ::= 'var' VariableSetterList ';'

Block:

Block

Block ::= '{' StatementWithLabels* '}'

IfElse:

IfElse

IfElse ::= 'if' '(' Expression ')' Statement ( 'else' Statement )?

SwitchBlock:

SwitchBlock

SwitchBlock ::= 'switch' '(' Expression ')' '{' ( CaseLabel ':' StatementWithLabels* )* ( 'default' ':' StatementWithLabels* )? '}'

CaseLabel:

CaseLabel

CaseLabel ::= 'case' ( BOOLEAN | INTEGER | STRING )

ForLoop:

ForLoop

ForLoop  ::= 'for' '(' ( VariableDecl | ExpressionList )? ';' Expression? ';' ExpressionList? ')' Statement

ExpressionList:

ExpressionList

ExpressionList ::= Expression ( ',' Expression )*

ForEachLoop:

ForEachLoop

ForEachLoop ::= 'foreach' '(' IDENTIFIER ( '=>' IDENTIFIER )? 'in' Expression ')' Statement

WhileLoop:

WhileLoop

WhileLoop ::= 'while' '(' Expression ')' Statement

DoLoop:

DoLoop

DoLoop   ::= 'do' Statement 'while' '(' Expression ')' ';'

Continue:

Continue

Continue ::= 'continue' ';'

Break:

Break

Break ::= 'break' ';'

Goto:

Goto

Goto ::= 'goto' ( IDENTIFIER | 'case' ( BOOLEAN | INTEGER | STRING ) | 'default' ) ';'

Yield:

Yield

Yield ::= 'yield' Expression ';'

Return:

Return

Return ::= 'return' Expression? ';'

Throw:

Throw

Throw ::= 'throw' Expression ';'

TryCatchFinally:

TryCatchFinally

TryCatchFinally ::= 'try' ( '(' Expression ')' )? Block ( 'catch' '(' IDENTIFIER ')' Block )? ( 'finally' Block )?

AssignmentWithLet:

AssignmentWithLet

AssignmentWithLet ::= 'let' Reference '=' Expression ';'

Reference:

Reference

Reference ::= VariableRef
            | ItemRef
            | SliceRef
            | PropertyRef
            | StaticPropertyRef
            | ParentPropertyRef
            | ParentIndexerRef
            | TupleInitializer
            | SetInitializer

Expression:

Expression

Expression ::= Assignment

Note: Expression is an axiom to the expressions sublanguage (which is recognized by the ExpressionParser).

Assignment:

Assignment

Assignment ::= TernaryExpression ( AssignmentOperator Assignment )*

AssignmentOperator:

AssignmentOperator

AssignmentOperator ::= '='
                     | '+='
                     | '-='
                     | '*='
                     | '/='
                     | '%='
                     | '#### ='
                     | '&='
                     | '|='
                     | '^='
                     | '<<='
                     | '>>='
                     | '??='

TernaryExpression:

TernaryExpression

TernaryExpression ::= Condition ( '?' Expression ':' Expression )?

Condition:

Condition

Condition ::= Relation ( LogicalOperator Relation )*

LogicalOperator:

LogicalOperator

LogicalOperator ::= '&'
                  | '&&'
                  | '|'
                  | '||'
                  | '^'
                  | '??'

Relation:

Relation

Relation ::= Term ( RelationalOperator Term | 'is' 'not'? Pattern )?

RelationalOperator:

RelationalOperator

RelationalOperator ::= '=='
                     | '!='
                     | '<'
                     | '>'
                     | '<='
                     | '>='
                     | '==='
                     | '!=='
                     | 'startswith'
                     | 'endswith'
                     | 'contains'
                     | 'matches'
                     | 'not'? 'in'

Term:

Term

Term ::= Factor ( ( '+' | '-' ) Factor )*

Factor:

Factor

Factor ::= Exponentiation ( ( '*' | '/' | '%' | '<<' | '>>' ) Exponentiation )*

Exponentiation:

Exponentiation

Exponentiation ::= PostfixUnaryExpression ( '#### ' Exponentiation )*

PostfixUnaryExpression:

PostfixUnaryExpression

PostfixUnaryExpression ::= PrefixUnaryExpression ( '++' | '--' | '!' )*

PrefixUnaryExpression:

PrefixUnaryExpression

PrefixUnaryExpression ::= ( '+' | '-' | '~' | '!' | '++' | '--' )* Composite

Composite:

Composite

Composite ::= Atom ( '[' ( Expression | Expression? '..' Expression? ) ']' | '.' IDENTIFIER ArgumentList? | ArgumentList | ( 'switch' '{' MatchCaseList | 'with' '{' VariableSetterList ) '}' )*

ArgumentList:

ArgumentList

ArgumentList ::= '(' ( Arguments ( ',' NamedArgList )? | NamedArgList )? ')'

Arguments:

Arguments

Arguments ::= Argument ( ',' Argument )*

Argument:

Argument

Argument ::= '..'? Expression

NamedArgList:

NamedArgList

NamedArgList ::= NamedArg ( ',' NamedArg )*

NamedArg:

NamedArg

NamedArg ::= IDENTIFIER ':' Expression

MatchCaseList:

MatchCaseList

MatchCaseList ::= MatchCase ( ',' MatchCase )*

MatchCase:

MatchCase

MatchCase ::= Pattern ( 'when' Expression )? '=>' MatchCaseExpression

Pattern:

Pattern

Pattern  ::= '_'
           | 'null'
           | ( '>' | '<' | '>=' | '<=' )? ValuePattern
           | 'matches' STRING
           | TYPE_NAME ( '(' IDENTIFIER ( ',' IDENTIFIER )* ')' | ObjectPattern )?
           | ObjectPattern
           | NegativePattern
           | LogicalPattern
           | GroupingPattern
           | MUTABLE_STRING

ValuePattern:

ValuePattern

ValuePattern ::= [+#x2D]? ( INTEGER | BIG_INTEGER | FLOAT | BIG_DECIMAL )
               | BOOLEAN
               | DATE
               | STRING

ObjectPattern:

ObjectPattern

ObjectPattern ::= '{' IDENTIFIER ':' Pattern ( ',' IDENTIFIER ':' Pattern )* '}'

NegativePattern:

NegativePattern

NegativePattern ::= 'not' Pattern

LogicalPattern:

LogicalPattern

LogicalPattern ::= Pattern ( ( 'or' | 'and' ) Pattern )+

GroupingPattern:

GroupingPattern

GroupingPattern ::= '(' Pattern ')'

MatchCaseExpression:

MatchCaseExpression

MatchCaseExpression ::= Block | 'throw'? Expression

Atom:

Atom

Atom   ::= Literal
         | MUTABLE_STRING
         | 'this'
         | AtomStartingWithSuper
         | AtomStartingWithTypeOf
         | AtomStartingWithTypeName
         | AtomStartingWithId
         | AtomStartingWithNew
         | AtomStartingWithLParen
         | AtomStartingWithLBrace
         | ListInitializer
         | Lambda
         | InlineFunction

AtomStartingWithSuper:

AtomStartingWithSuper

AtomStartingWithSuper ::= 'super' ( '::' IDENTIFIER ArgumentList? | '[' Expression ']' )

AtomStartingWithTypeOf:

AtomStartingWithTypeOf

AtomStartingWithTypeOf ::= 'typeof' '(' ( TYPE_NAME | IDENTIFIER ) ')'

AtomStartingWithTypeName:

AtomStartingWithTypeName

AtomStartingWithTypeName ::= TYPE_NAME '::' IDENTIFIER ArgumentList?

AtomStartingWithId:

AtomStartingWithId

AtomStartingWithId ::= QualifiedName ArgumentList?

AtomStartingWithNew:

AtomStartingWithNew

AtomStartingWithNew ::= ObjectInitializer | ConstructorCall

ObjectInitializer:

ObjectInitializer

ObjectInitializer ::= 'new' '{' VariableSetterList? '}'

ConstructorCall:

ConstructorCall

ConstructorCall ::= 'new' QualifiedName ( ArgumentList ( '{' VariableSetterList? '}' )? | '{' VariableSetterList? '}' )

AtomStartingWithLParen:

AtomStartingWithLParen

AtomStartingWithLParen ::= Conversion | TupleInitializer | ParenthesizedExpression

Conversion:

Conversion

Conversion ::= '(' TYPE_NAME ')' Expression

TupleInitializer:

TupleInitializer

TupleInitializer ::= '(' Arguments ','? ')'

ParenthesizedExpression:

ParenthesizedExpression

ParenthesizedExpression ::= '(' Expression ')'

AtomStartingWithLBrace:

AtomStartingWithLBrace

AtomStartingWithLBrace ::= SetInitializer | MapInitializer

SetInitializer:

SetInitializer

SetInitializer ::= '{' Arguments? '}'

MapInitializer:

MapInitializer

MapInitializer ::= '{' ( MapItemInitializerList | '=>' ) '}'

MapItemInitializerList:

MapItemInitializerList

MapItemInitializerList ::= MapItemInitializer ( ',' MapItemInitializer )*

MapItemInitializer:

MapItemInitializer

MapItemInitializer ::= Expression '=>' Expression

ListInitializer:

ListInitializer

ListInitializer ::= '[' Arguments? ']'

Lambda:

Lambda

Lambda   ::= '|' ( Parameter ( ',' Parameter )* )? '|' '=>' ( Expression ';' | Block )

InlineFunction:

InlineFunction

InlineFunction ::= 'function' ParameterList Block

Terminal symbols

LETTER:

LETTER

LETTER ::= 'A' - 'Z' | 'a' - 'z'

LETTER_EXTENDED:

LETTER_EXTENDED

LETTER_EXTENDED ::= LETTER
                  | '_'
                  | '\xc0' - '\xd6'
                  | '\xd8' - '\xf6'
                  | '\xf8' - '\xff'

DIGIT:

DIGIT

DIGIT ::= '0' - '9'

HEXDIGIT:

HEXDIGIT

HEXDIGIT ::= DIGIT | 'A' - 'F' | 'a' - 'f'

IDENTIFIER:

IDENTIFIER

IDENTIFIER ::= STANDARD_IDENTIFIER | SPECIAL_IDENTIFIER

STANDARD_IDENTIFIER:

STANDARD_IDENTIFIER

STANDARD_IDENTIFIER ::= LETTER_EXTENDED ( LETTER_EXTENDED | DIGIT )*

SPECIAL_IDENTIFIER:

SPECIAL_IDENTIFIER

SPECIAL_IDENTIFIER ::= '$' ( LETTER_EXTENDED | DIGIT | ESCAPE_SEQ )+

ESCAPE_SEQ:

ESCAPE_SEQ

ESCAPE_SEQ ::= '\a'
             | '\b'
             | '\f'
             | '\n'
             | '\r'
             | '\t'
             | '\v'
             | ( '\x' | '\u' HEXDIGIT HEXDIGIT ) HEXDIGIT HEXDIGIT

BOOLEAN:

BOOLEAN

BOOLEAN ::= 'true' | 'false'

INTEGER:

INTEGER

INTEGER ::= DECIMAL_INTEGER | HEX_INTEGER

DECIMAL_INTEGER:

DECIMAL_INTEGER

DECIMAL_INTEGER ::= ( DIGIT ( '_' DIGIT )* )+

HEX_INTEGER:

HEX_INTEGER

HEX_INTEGER ::= '0' [Xx] HEXDIGIT+

BIG_INTEGER:

BIG_INTEGER

BIG_INTEGER ::= INTEGER [Ll]

REAL:

REAL

REAL ::= ( DECIMAL_INTEGER? '.' )? DECIMAL_INTEGER ( ( 'e' | 'E' ) ( '+' | '-' )? DECIMAL_INTEGER )?

FLOAT:

FLOAT

FLOAT ::= REAL [Ff]?

BIG_DECIMAL:

BIG_DECIMAL

BIG_DECIMAL ::= REAL [Dd]

COMPLEX:

COMPLEX

COMPLEX ::= REAL [iI]

DATE:

DATE

DATE ::= '`' [^`]* '`'

MUTABLE_STRING:

MUTABLE_STRING

MUTABLE_STRING ::= '$' STRING

STRING:

STRING

STRING ::= '@'? ( SINGLE_QUOTED | DOUBLE_QUOTED )

BLOB:

BLOB

BLOB ::= [bB] ( SINGLE_QUOTED | DOUBLE_QUOTED )

SINGLE_QUOTED:

SINGLE_QUOTED

SINGLE_QUOTED ::= "'" ( [^'] | ESCAPE_SEQ )* "'"

DOUBLE_QUOTED:

DOUBLE_QUOTED

DOUBLE_QUOTED ::= '"' ( [^"] | ESCAPE_SEQ )* '"'

TYPE_NAME:

TYPE_NAME

TYPE_NAME ::= 'void'
            | 'bool'
            | 'int'
            | 'long'
            | 'rational'
            | 'float'
            | 'decimal'
            | 'complex'
            | 'date'
            | 'duration'
            | 'string'
            | 'list'
            | 'map'
            | 'set'
            | 'queue'
            | 'stack'
            | 'object'
            | 'resource'
            | 'closure'

MODIFIER:

MODIFIER

MODIFIER ::= 'final' | 'static' | 'abstract'

SCOPE:

SCOPE

SCOPE ::= 'private' | 'protected' | 'public'

rr-2.6 generated by RR - Railroad Diagram Generator