IBM InfoSphere Streams Version 4.1.0

Grammar overview

Here is the SPL grammar syntax top-down, with references to the sections that contain the semantics.

For more information, see Lexical syntax and Grammar notation.

The compilation unit is the start symbol of the SPL grammar.

compilationUnit   ::= namespace? useDirective*  # Compile-time entities
                      ( compositeDef | functionDef | standAloneTypeDef )*
namespace         ::= ‘namespace' ID+. ‘;'
useDirective      ::= ‘use' ID+. ‘::' ( ‘*' | ID ) ‘;apos;
Composite operators are defined at the top level in a namespace.
compositeDef    ::= compositeHead compositeBody # Composite operators
compositeHead   ::= ‘public'?composite' ID ( ‘(' compositeInOut+; ‘)' )?
compositeInOut  ::= ( ‘input' | ‘output' ) ( streamType? ID )+,
streamType      ::= ‘stream' ‘<' tupleBody ‘>'
compositeBody   ::= ‘{'
                    ( ‘param' compositeFormal+ )?
                    ( ‘type' compositeTypeDef+ )?
                    ( ‘graph' opInvoke+        )?
                    ( ‘config' configuration+  )?}'
compositeFormal ::= expressionMode ID ( ‘:' opActual )? ‘; # Operator parameter modes
opInvokeActual  ::= ID ‘:' opActual ‘;'
opActual        ::= type | expr+,
configuration   ::= ID ‘:' expr+, ‘;'  # Config clause, Config clause
Streams are defined in a composite operator's graph clause.
opInvoke        ::= opInvokeHead opInvokeBody  # Operator invocations
opInvokeHead    ::= opOutputs ( ‘as' ID )? ‘=' ID opInputs  # Operator invocation head
opOutputs       ::= opOutput | ‘(' opOutput*; ‘)'
opOutput        ::= streamType ID ( ‘as' ID )?
opInputs        ::= ‘(' portInputs*; ‘)'
portInputs      ::= streamType? ID+, ( ‘as' ID )?
opInvokeBody    ::= ‘{'  # Operator invocations
                    ( ‘logic' opInvokeLogic+ )?
                    ( ‘window' opInvokeWindow+ )?
                    ( ‘param' opInvokeActual+ )?
                    ( ‘output' opInvokeOutput+ )?
                    ( ‘config' configuration+ )?
                    ‘}'
opInvokeLogic   ::= opInvokeCode | opInvokeState  # Logic clause
opInvokeCode    ::= 'onProcess' ':' stmt
                    | ( 'onTuple' | 'onPunct' ) ':' stmt
opInvokeState   ::= ‘state' ‘:' ( varDef | ‘{' varDef+ ‘}' )
opInvokeWindow  ::= ID ‘:' expr+, ‘;'  # Window clause
opInvokeOutput  ::= ID ‘:' ( ID ‘=' expr )+, ‘;'  # Output clause
SPL functions are defined at the top level in a namespace.
functionDef      ::= functionHead blockStmt  # SPL functions
functionHead     ::= functionModifier* type ID ‘(' functionFormal*, ‘)'
functionModifier ::= ‘public' | ‘stateful'
functionFormal   ::= ‘mutable'? type ID
Native function prototype declarations come from XML files, not regular SPL files.
functionPrototype    ::= genericFormals functionModifier*  # Native functions
                        type ID ‘(' protoFormal*, ‘)'
genericFormals       ::= ( ‘<' typeFormal+, ‘>' )? ( ‘[' boundsFormal+, ‘]' )?
typeFormal           ::= typeFormalConstraint ID
typeFormalConstraint ::= ‘any' | ‘collection' | ‘complex' | ‘composite'
                       | ‘decimal' | ‘enum' | ‘float' | ‘floatingpoint'
                       | ‘integral' | ‘list' | ‘map' | ‘numeric' | ‘ordered'
                       | ‘primitive' | ‘set' | ‘string' | ‘tuple'
boundsFormal         ::= ID
protoFormal          ::= formalModifier* type ID?
Imperative statements can appear in function bodies or the logic clause of an operator invocation.
stmt          ::= varDef | blockStmt | exprStmt  # Statements
                | ifStmt | forStmt | whileStmt
                | breakStmt | continueStmt | returnStmt
varDef        ::= ‘mutable'? type  ( ID ( ‘=' expr )? )+, ‘;'
blockStmt     ::= ‘{' ( stmt | standAloneTypeDef )*}'
exprStmt      ::= expr ‘;'
ifStmt        ::= ‘if' ‘(' expr ‘)' stmt ( ‘else' stmt )?
forStmt       ::= ‘for' ‘(' type ID ‘in' expr ‘)' stmt
whileStmt     ::= ‘while' ‘(' expr ‘)' stmt
breakStmt     ::= ‘break' ‘;'
continueStmt  ::= ‘continue' ‘;'
returnStmt    ::= ‘return' expr? ‘;'
Expressions can appear in many places in the grammar. For precedence and associativity, see # Expression operators.
expr            ::= prefixExpr | infixExpr | postfixExpr
                  | conditionalExpr | ‘(' expr ‘)' | ID 
                  | literal  # Expression language
prefixExpr      ::= prefixOp expr
prefixOp        ::= ‘!' | ‘-' | ‘~' | ‘++' | ‘--'
infixExpr       ::= expr ( infixOp | mappedOp | assignOp ) expr
infixOp         ::= ‘+' | ‘-' | ‘*' | ‘/' | ‘%' | ‘<<' | ‘>>' | ‘&' | ‘ˆ' | ‘|'
                  | ‘&&' | ‘||' | ‘in' | ‘<' | ‘<=' | ‘>' | ‘>=' | ‘!=' | ‘=='
mappedOp        ::= ‘.+' | ‘.-' | ‘.*' | ‘./' | ‘.%' | ‘.<<' | ‘.>>' | ‘.&'
                  | ‘.^' | ‘.|' | ‘.<' | ‘.<=' | ‘.>' | ‘.>=' | ‘.!=' | ‘.=='
assignOp        ::= ‘=' | ‘+=' | ‘-=' | ‘*=' | ‘/=' | ‘%=' | ‘<<=' | ‘>>='
                  | ‘&=' | ‘^=' | ‘|='
postfixExpr     ::= ID ‘(' expr*, ‘)'
                  | type ‘(' expr ‘)'
                  | expr ‘[' subscript ‘]'
                  | expr ‘.' ID
                  | expr postfixOp
subscript       ::= expr | ( expr? ‘:' expr? )
postfixOp       ::= ‘++' | ‘--'
conditionalExpr ::= expr ‘?' expr ‘:' expr
Literals are the highest-precedence expressions that denote values.
literal           ::= primitiveLiteral | listLiteral | setLiteral | mapLiteral 
                      | tupleLiteral # Expression language
listLiteral       ::= ‘[' expr*, ‘]'  # Collections
setLiteral        ::= ‘{' expr*, ‘}'
mapLiteral        ::= ‘{' ( expr ‘:' expr )*, ‘}'
tupleLiteral      ::= ‘{' ( ID ‘=' expr)*, ‘}'  # Tuples
primitiveLiteral  ::= ‘true' | ‘false' | STRING | FLOAT | INT  # Primitive types;
Types are defined in a composite operator's type clause, or in a block, or at the top level.
standAloneTypeDef ::= ‘type' ID=' ( type | tupleBody ) ‘;'
compositeTypeDef  ::= ‘static'? ID=' ( type | tupleBody ) ‘;'  # Tuples
expressionMode  ::= ‘attribute' | ‘expression' typeArgs?  # Operator parameter modes
                  | ‘function' | ‘operator' | ‘type'
type            ::= ID | ‘void' | primitiveType | compositeType  # Types
typeArgs        ::= ‘<' type+, ‘>'
typeDims        ::= ‘[' expr ‘]'
Primitive types are types without other types as arguments.
primitiveType   ::= ‘boolean'  # Primitive types
                  | ‘enum' ‘{' ID*, ‘}'
                  | ‘int8' | ‘int16' | ‘int32' | ‘int64' | ‘int128'
                  | ‘uint8' | ‘uint16' | ‘uint3'| ‘uint64' | ‘uint128'
                  | ‘float32' | ‘float64'
                  | ‘decimal32' | ‘decimal64' | ‘decimal128'
                  | ‘complex32' | ‘complex64'
                  | ‘timestamp'
                  | ‘blob'
                  | ‘rstring' typeDims?
                  | ‘ustring'
                  | ‘xml' ('<' "schemaURI" '>')?
Composite types are type constructors for composing new types out of other types.
compositeType   ::= tupleType  # Composite types
                 | ‘list' typeArgs typeDims?
                 | ‘map' typeArgs typeDims?
                 | ‘set' typeArgs typeDims?
tupleType       ::= ‘tuple' ‘<' tupleBody ‘>'  # Tuples
tupleBody       ::= attributeDecl+,
                 | ( ID | tupleType )+,
attributeDecl   ::= type ID