rendered paste body"Start Symbol" = <File>
! ------------------------------------------------- Sets
{ID Head} = {Letter} + [_]
{ID Tail} = {Alphanumeric} + [_]
{String Chars} = {Printable} - ["\]
{Number Types} = [fd]
! ------------------------------------------------- Terminals
Identifier = {ID Head}{ID Tail}*
StringLiteral = '"' ( {String Chars} | '\' {Printable} )* '"'
!DecimalLiteral = '{Numeric}.{Numeric}{Number Types}?'
DecimalLiteral = '{Numeric}.{Numeric}'
FloatLiteral = '{Numeric}*(.{Numeric}*)?f'
DoubleLiteral = '{Numeric}*(.{Numeric}*)?d?'
!IntegerLiteral = '{Numeric}{Number Types}?'
IntegerLiteral = '{Numeric}'
! ------------------------------------------------- Rules
<Name> ::= <SimpleName>
| <QualifiedName>
<SimpleName> ::= Identifier
<QualifiedName> ::= <QualifiedName> '.' <Name>
<ReturnType> ::= <Name>
| 'void'
<BooleanExpression> ::= <RValue> '>' <Add Exp>
| <RValue> '<' <Add Exp>
| <RValue> '<=' <Add Exp>
| <RValue> '>=' <Add Exp>
| <RValue> '==' <Add Exp> !Equal
| <RValue> '<>' <Add Exp> !Not equal
| <RValue>
<NumericalExpression> ::= <Add Exp>
<Add Exp> ::= <Add Exp> '+' <Mult Exp>
| <Add Exp> '-' <Mult Exp>
| <Mult Exp>
<Mult Exp> ::= <Mult Exp> '*' <Negate Exp>
| <Mult Exp> '/' <Negate Exp>
| <Mult Exp> '%' <Negate Exp>
| <Negate Exp>
<Negate Exp> ::= '-' <RValue>
| <RValue> '++'
| <RValue> '--'
| '++' <RValue>
| '--' <RValue>
| <RValue>
! ----------------------------------------------- Values -----------------------------------------------
<RValue> ::= <Literal>
| <BooleanExpression>
<LValue> ::= <Name>
| <RValue>
<Literal> ::= <NumericalLiteral>
| <BooleanLiteral>
| StringLiteral
| 'null'
<NumericalLiteral> ::= FloatLiteral
| DoubleLiteral
| IntegerLiteral
<BooleanLiteral> ::= 'true'
| 'false'
! ----------------------------------------------- Language Constructs -----------------------------------------------
<File> ::= <FileLevelItems>
! Items at the root of a file
<FileLevelItems> ::= <FileLevelItem> <FileLevelItems>
| <FileLevelItem>
| ''
<FileLevelItem> ::= <NamespaceDeclaration>
| <UsingStatement>
! Namespace Items
<NamespaceLevelItems> ::= <NamespaceLevelItem> <NamespaceLevelItems>
| <NamespaceLevelItem>
| ''
<NamespaceLevelItem> ::= <AccessModifier> <ClassDeclaration>
| <AccessModifier> <DelegateDeclaration>
| <FileLevelItem>
! Class members
<ClassLevelItems> ::= <ClassLevelItem> <ClassLevelItems>
| <ClassLevelItem>
| ''
<ClassLevelItem> ::= <AccessModifier> <VariableDeclaration>
| <AccessModifier> <MethodDeclaration>
| <NamespaceLevelItem>
! Statements
<MethodLevelItems> ::= <MethodLevelItem> <MethodLevelItems>
| <MethodLevelItem>
| ''
<MethodLevelItem> ::= <LValue> '=' <RValue> ! Assignment operator
| <VariableDeclaration>
! ----------------------------------------------- Declarations -----------------------------------------------
! Import a namespace's symbols
<UsingStatement> ::= 'using' <Name>
<NamespaceDeclaration>::= 'namespace' <Name> '{' <NamespaceLevelItems> '}'
<ClassDeclaration> ::= 'class' Identifier '{' <ClassLevelItems> '}'
<DelegateDeclaration> ::= 'delegate' <MethodSignature> ';'
<VariableDeclaration> ::= <Name> Identifier ';'
<MethodDeclaration> ::= <MethodModifier> <MethodSignature> '{' <MethodLevelItems> '}'
<MethodSignature> ::= <ReturnType> <Name> '(' <MethodArguments> ')'
| 'void' <ReturnType> '(' <MethodArguments> ')'
<MethodArguments> ::= <MethodArgument> <MethodArguments>
| <MethodArgument>
| ''
<MethodArgument> ::= <Name> Identifier
! ----------------------------------------------- Modifiers -----------------------------------------------
<AccessModifier> ::= 'public'
| 'internal'
| 'private'
| ''
<MethodModifier> ::= 'static'
| 'abstract'
| 'virtual'
| ''