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