Specript Syntax EBNF rev.0.6.0 www.specript.org

Specript Syntax EBNF rev.0.6.0

Start ::= SpecFile
SpecFile ::= NamespaceDeclarations ( UsingDeclaration | AliasDefinition )* ( PropertyDefinition | FunctionDefinition | SpecDefinition | InternPropertyDefinition | InternFunctionDefinition | ExternPropertyDefinition | ExternFunctionDefinition | BuiltinSpecDefinition )* <EOF>
NamespaceDeclarations ::= ( NamespaceDeclaration )+
NamespaceDeclaration ::= NamespaceKeyword NamespacePath <SCLN>
NamespaceKeyword ::= <NAMESPACE>
NamespacePath ::= Identifier ( <NSDLM> Identifier )*
UsingDeclaration ::= UsingKeyword NamespacePath <SCLN>
UsingKeyword ::= <USING>
AliasDefinition ::= AliasKeyword Identifier <CLN> NamespacePath <SCLN>
AliasKeyword ::= <ALIAS>
GenericAccessControlQualifier ::= ( <PUBLIC> | <PRIVATE> )
PublicAccessControlQualifier ::= <PUBLIC>
FeaturedAccessControlQualifier ::= <FEATURED>
NotNullQualifier ::= <NOT> <NULL>
InternSpecifier ::= <INTERN>
ExternSpecifier ::= <EXTERN>
IdentifierPath ::= Identifier ( <NSDLM> Identifier )*
Identifier ::= <IDENTIFIER>
PropertyKeyword ::= <PROPERTY>
PropertyDefinition ::= ( GenericAccessControlQualifier )? PropertyKeyword Identifier ( <CLN> ( NotNullQualifier )? Spec )? <EQ> Expression ( SpecViolationInfo )? <SCLN>
InternPropertyDefinition ::= ( GenericAccessControlQualifier )? InternSpecifier PropertyKeyword Identifier ( <CLN> ( NotNullQualifier )? Spec )? ( SpecViolationInfo )? <SCLN>
ExternPropertyDefinition ::= ( GenericAccessControlQualifier )? ExternSpecifier PropertyKeyword Identifier <CLN> ( NotNullQualifier )? Spec ( SpecViolationInfo )? <SCLN>
FunctionKeyword ::= <FUNCTION>
LocalPropertyDefinitions ::= ( LocalPropertyDefinition <COMMA> )+
LocalPropertyDefinition ::= Identifier ( <CLN> Spec )? <EQ> Expression
FunctionDefinition ::= ( GenericAccessControlQualifier | FeaturedAccessControlQualifier )? FunctionKeyword Identifier ( <L_PRN> ( ArgumentDefinitionList )? <R_PRN> )? ( <CLN> Spec )? <EQ> ( LocalPropertyDefinitions )? Expression <SCLN>
InternFunctionDefinition ::= ( GenericAccessControlQualifier | FeaturedAccessControlQualifier )? InternSpecifier FunctionKeyword Identifier ( <L_PRN> ( ArgumentDefinitionList )? <R_PRN> )? ( <CLN> Spec )? <SCLN>
ExternFunctionDefinition ::= ( GenericAccessControlQualifier | FeaturedAccessControlQualifier )? ExternSpecifier FunctionKeyword Identifier ( <L_PRN> ( ExternArgumentDefinitionList )? <R_PRN> )? <CLN> Spec <SCLN>
BuiltinSpecDefinition ::= PublicAccessControlQualifier SpecKeyword BuiltinType <CLN> SpecForBuiltinSpecDefinition
SpecDefinition ::= ( GenericAccessControlQualifier )? SpecKeyword Identifier <CLN> SpecForSpecDefinition
SpecKeyword ::= <SPEC>
BuiltinType ::= ( <INTEGER> | <DECIMAL> | <REAL> | <DATE> | <TIMESTAMP> | <STRING> | <BOOLEAN> | <RECORD> | <RANGE> | <LIST> | <MAP> )
SpecForBuiltinSpecDefinition ::= BuiltinSpecBasePart SpecDerivedPart
SpecForSpecDefinition ::= ( SpecBasePart )? SpecDerivedPart
Spec ::= ( ( SpecBasePart ( SpecDerivedPart )? ) | ( SpecDerivedPart ) )
BuiltinSpecBasePart ::= <SYSTEM> <NSDLM> BuiltinType
SpecBasePart ::= ( PrimitiveType | RecordType | ListType | MapType | IdentifierPath )
PrimitiveType ::= ( ( <INTEGER> ) | ( <DECIMAL> ) | ( <REAL> ) | ( <DATE> ) | ( <TIMESTAMP> ) | ( <STRING> ) | ( <BOOLEAN> ) )
RecordType ::= <RECORD>
RangeType ::= <RANGE>
ListType ::= <LIST> <LT> TypeArgument <GT>
MapType ::= <MAP> <LT> TypeArgument <COMMA> TypeArgument <GT>
TypeArgument ::= Spec
SpecDerivedPart ::= <L_BRC> ( ElementPropertyDefinition | ElementFunctionDefinition | ElementInternPropertyDefinition | ElementInternFunctionDefinition | ConstraintDefinitionBlock | OutOfBlockConstraintPropertyDefinition | OutOfBlockConstraintFunctionDefinition )* <R_BRC>
ElementPropertyDefinition ::= PropertyKeyword Identifier ( <CLN> ( NotNullQualifier )? Spec )? ( <EQ> Expression )? ( SpecViolationInfo )? <SCLN>
ElementInternPropertyDefinition ::= InternSpecifier PropertyKeyword Identifier ( <CLN> ( NotNullQualifier )? Spec )? ( SpecViolationInfo )? <SCLN>
ElementFunctionDefinition ::= FunctionKeyword Identifier ( <L_PRN> ( ArgumentDefinitionList )? <R_PRN> )? ( <CLN> Spec )? <EQ> ( LocalPropertyDefinitions )? Expression <SCLN>
ElementInternFunctionDefinition ::= InternSpecifier FunctionKeyword Identifier ( <L_PRN> ( ArgumentDefinitionList )? <R_PRN> )? ( <CLN> Spec )? <SCLN>
ConstraintKeyword ::= <CONSTRAINT>
ConstraintDefinitionBlock ::= ConstraintKeyword <L_BRC> ( ConstraintDefinitionBlockBody )? <R_BRC>
ConstraintDefinitionBlockBody ::= ( ConstraintPropertyDefinition | ConstraintFunctionDefinition )+
OutOfBlockConstraintPropertyDefinition ::= ConstraintKeyword ConstraintPropertyDefinition
OutOfBlockConstraintFunctionDefinition ::= ConstraintKeyword ConstraintFunctionDefinition
ConstraintPropertyDefinition ::= PropertyKeyword Identifier ( <CLN> ( NotNullQualifier )? Spec )? ( <EQ> Expression )? ( SpecViolationInfo )? <SCLN>
ConstraintFunctionDefinition ::= FunctionKeyword Identifier ( <CLN> <BOOLEAN> )? <EQ> Expression ( SpecViolationInfo )? <SCLN>
ArgumentDefinitionList ::= ( QuotedExpressionArgumentDefinition | ArgumentDefinition ) ( <COMMA> ( QuotedExpressionArgumentDefinition | ArgumentDefinition ) )*
ArgumentDefinition ::= Identifier ( <CLN> Spec )? ( <EQ> Expression )?
QuotedExpressionArgumentDefinition ::= Identifier <L_PRN> ( ArgumentDefinitionList )+ <R_PRN> ( <CLN> Spec )? ( <EQ> QuotedExpression )?
ExternArgumentDefinitionList ::= ExternArgumentDefinition ( <COMMA> ExternArgumentDefinition )*
ExternArgumentDefinition ::= Identifier <CLN> Spec ( <EQ> Expression )?
SpecViolationInfo ::= ( ( <HASH> Expression ) | ( <HASHHASH> Identifier ) )
DecimalLiteral ::= <DECIMAL_LITERAL>
IntegerLiteral ::= <INTEGER_LITERAL>
RealLiteral ::= <REAL_LITERAL>
DateLiteral ::= <DATE_LITERAL>
TimestampLiteral ::= <TIMESTAMP_LITERAL>
BooleanLiteral ::= ( <TRUE> | <FALSE> )
StringLiteral ::= <STRING_LITERAL>
NullLiteral ::= <NULL>
EmptyListLiteral ::= <L_BRKT> <R_BRKT>
EmptyMapLiteral ::= <L_BRKT> <R_ARROW> <R_BRKT>
RangeUnlimitedLiteral ::= <ASTER>
PrimitiveLiteral ::= ( IntegerLiteral | DecimalLiteral | RealLiteral | DateLiteral | TimestampLiteral | BooleanLiteral | StringLiteral | NullLiteral )
RecordExpression ::= <L_BRC> ( RecordExpressionElement ( <COMMA> RecordExpressionElement )* )* <R_BRC>
RecordModificationExpression ::= <L_BRC> Identifier <CLN> RecordModificationExpressionElement ( <COMMA> RecordModificationExpressionElement )* <R_BRC>
RecordModificationExpressionElement ::= Identifier <EQ> Expression
RecordExpressionElement ::= Identifier ( <CLN> Spec )? <EQ> Expression ( SpecViolationInfo )?
RangeExpression ::= ( ( <L_BRKT> Expression <DOTDOT> Expression <R_BRKT> ) | ( <L_BRKT> Expression <DOTDOT> RangeUnlimitedLiteral <R_BRKT> ) | ( <L_BRKT> RangeUnlimitedLiteral <DOTDOT> Expression <R_BRKT> ) )
ListExpression ::= ( ( EmptyListLiteral ) | ( <L_BRKT> Expression ( <COMMA> Expression )* <R_BRKT> ) | ( RangeExpression ) )
MapExpression ::= ( ( EmptyMapLiteral ) | ( <L_BRKT> MapExpressionEntry ( <COMMA> MapExpressionEntry )* <R_BRKT> ) )
MapExpressionEntry ::= Expression <R_ARROW> Expression
PropertyReferenceOrFunctionCall ::= IdentifierPath ( <L_PRN> ( FunctionArgument )? <R_PRN> )?
FunctionArgument ::= ( NamedArgumentList | ArgumentList )
ArgumentList ::= Argument ( <COMMA> Argument )*
Argument ::= ( Expression | QuotedExpression )
NamedArgumentList ::= NamedArgument ( <COMMA> NamedArgument )*
QuotedExpression ::= <PP> Expression <PP>
NamedArgument ::= Identifier <EQ> ( Expression | QuotedExpression )
ElementAccess ::= ( <DOT> ElementPropertyAndFunctionAccess )+
ElementPropertyAndFunctionAccess ::= Identifier ( <L_PRN> ( FunctionArgument )? <R_PRN> )?
RecordAccess ::= <DOT> <L_BRC> ( Identifier ( <COMMA> Identifier )* )* <R_BRC>
ListSelectionAccess ::= Identifier <PP> Expression
ListAndMapAccess ::= ( <L_BRKT> ( ListIndexOrMapKeyAccess | ListSelectionAccess ) <R_BRKT> )+
ListIndexOrMapKeyAccess ::= Expression
This ::= <THIS>
PrimaryExpression ::= ( PrimitiveLiteral | RecordExpression | RecordModificationExpression | RangeExpression | ListExpression | MapExpression | This | PropertyReferenceOrFunctionCall | <L_PRN> Expression <R_PRN> )
AccessExpression ::= PrimaryExpression ( ElementAccess | RecordAccess | ListAndMapAccess )*
UnaryExpression ::= ( UnaryOperator | CastOperator )* AccessExpression
UnaryOperator ::= ( <PLUS> | <MINUS> | <EXCLM> )
CastOperator ::= <LTLT> Spec <LTLT>
MultiplicativeExpression ::= UnaryExpression ( MultiplicativeOperator UnaryExpression )*
MultiplicativeOperator ::= ( <ASTER> | <SLASH> | <PRCNT> )
AdditiveExpression ::= MultiplicativeExpression ( AdditiveOperator MultiplicativeExpression )*
AdditiveOperator ::= ( <PLUS> | <MINUS> )
RelationalExpression ::= AdditiveExpression ( RelationalOperator AdditiveExpression )* ( IsExpression )*
RelationalOperator ::= ( <LT> | <GT> | <LE> | <GE> )
IsExpression ::= IsOperator Spec
IsOperator ::= <IS>
EqualityExpression ::= RelationalExpression ( EqualityOperator RelationalExpression )*
EqualityOperator ::= ( <EQEQ> | <NE> | <SPEQ> | <IN> )
ConditionalAndExpression ::= EqualityExpression ( ConditionalAndOperator EqualityExpression )*
ConditionalAndOperator ::= <ANDAND>
ConditionalOrExpression ::= ConditionalAndExpression ( ConditionalOrOperator ConditionalAndExpression )*
ConditionalOrOperator ::= <PPPP>
ConditionalExpression ::= ConditionalOrExpression ( ConditionalOperator Expression <CLN> ConditionalExpression )*
ConditionalOperator ::= <QSTN>
BranchingExpression ::= ConditionalExpression ( BranchingOperator ConditionalOrExpression <QSTN> ConditionalOrExpression ( <CLN> ConditionalOrExpression <QSTN> ConditionalOrExpression )* )*
BranchingOperator ::= ( <EQEQQS> | <EXEQQS> | <SPEQQS> | <LTEQQS> | <GTEQQS> | <LTQS> | <GTQS> | <IN> <QSTN> | <IS> <QSTN> )
Expression ::= BranchingExpression

(c)2007-2008, Specript Development Team Last Updated: 2008-05-29