• DoctypeDeclaration{http://etl.sf.net/etl/doctype/0.2.1}:
    • publicId: "-//IDN etl.sf.net//ETL//Grammar 0.2.1"
  • Grammar{http://etl.sf.net/etl/grammar/0.2.1}:
    • name:
      • calculator
      • CalculatorLogic
    • content:
      • GrammarInclude{http://etl.sf.net/etl/grammar/0.2.1}:
        • systemId: "calculator-vars-0_2_1.g.etl"
      • Namespace{http://etl.sf.net/etl/grammar/0.2.1}:
        • prefix: t
        • uri: "http://etl.sf.net/samples/calculator"
      • Namespace{http://etl.sf.net/etl/grammar/0.2.1}:
        • defaultModifier:
          • Modifier{http://etl.sf.net/etl/grammar/0.2.1}:
            • value: default
        • prefix: l
        • uri: "http://etl.sf.net/samples/calculator/logic"
      • Context{http://etl.sf.net/etl/grammar/0.2.1}:
        • defaultModifier:
          • Modifier{http://etl.sf.net/etl/grammar/0.2.1}:
            • value: default
        • name: Expressions
        • content:
          • ContextImport{http://etl.sf.net/etl/grammar/0.2.1}:
            • localName: matchSelectors
            • contextName: Selectors
          • ContextImport{http://etl.sf.net/etl/grammar/0.2.1}:
            • localName: selectSelectors
            • contextName: Selectors
          • OperatorDefinition{http://etl.sf.net/etl/grammar/0.2.1}:
            • isComposite:
              • Modifier{http://etl.sf.net/etl/grammar/0.2.1}:
                • value: composite
            • name: BooleanLiteral
            • associativity: f
            • syntax:
              • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                • syntax:
                  • ObjectOp{http://etl.sf.net/etl/grammar/0.2.1}:
                    • name:
                      • ObjectName{http://etl.sf.net/etl/grammar/0.2.1}:
                        • prefix: t
                        • name: BooleanLiteral
                    • syntax:
                      • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                        • syntax:
                          • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                            • name: value
                            • operator: =
                            • expression:
                              • ChoiceOp{http://etl.sf.net/etl/grammar/0.2.1}:
                                • options:
                                  • TokenOp{http://etl.sf.net/etl/grammar/0.2.1}:
                                    • value: true
                                • options:
                                  • TokenOp{http://etl.sf.net/etl/grammar/0.2.1}:
                                    • value: false
          • OperatorDefinition{http://etl.sf.net/etl/grammar/0.2.1}:
            • name: LessThen
            • associativity: xfx
            • precedence: 1200
            • text: <
            • syntax:
              • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                • name: first
                • operator: =
                • expression:
                  • OperandOp{http://etl.sf.net/etl/grammar/0.2.1}:
                    • position: left
              • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                • name: second
                • operator: =
                • expression:
                  • OperandOp{http://etl.sf.net/etl/grammar/0.2.1}:
                    • position: right
          • OperatorDefinition{http://etl.sf.net/etl/grammar/0.2.1}:
            • name: LessOrEqual
            • associativity: xfx
            • precedence: 1200
            • text: <=
            • syntax:
              • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                • name: first
                • operator: =
                • expression:
                  • OperandOp{http://etl.sf.net/etl/grammar/0.2.1}:
                    • position: left
              • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                • name: second
                • operator: =
                • expression:
                  • OperandOp{http://etl.sf.net/etl/grammar/0.2.1}:
                    • position: right
          • OperatorDefinition{http://etl.sf.net/etl/grammar/0.2.1}:
            • name: MoreThen
            • associativity: xfx
            • precedence: 1200
            • text: >
            • syntax:
              • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                • name: first
                • operator: =
                • expression:
                  • OperandOp{http://etl.sf.net/etl/grammar/0.2.1}:
                    • position: left
              • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                • name: second
                • operator: =
                • expression:
                  • OperandOp{http://etl.sf.net/etl/grammar/0.2.1}:
                    • position: right
          • OperatorDefinition{http://etl.sf.net/etl/grammar/0.2.1}:
            • name: MoreOrEqual
            • associativity: xfx
            • precedence: 1200
            • text: >=
            • syntax:
              • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                • name: first
                • operator: =
                • expression:
                  • OperandOp{http://etl.sf.net/etl/grammar/0.2.1}:
                    • position: left
              • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                • name: second
                • operator: =
                • expression:
                  • OperandOp{http://etl.sf.net/etl/grammar/0.2.1}:
                    • position: right
          • OperatorDefinition{http://etl.sf.net/etl/grammar/0.2.1}:
            • name: Equal
            • associativity: xfx
            • precedence: 1300
            • text: ==
            • syntax:
              • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                • name: first
                • operator: =
                • expression:
                  • OperandOp{http://etl.sf.net/etl/grammar/0.2.1}:
                    • position: left
              • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                • name: second
                • operator: =
                • expression:
                  • OperandOp{http://etl.sf.net/etl/grammar/0.2.1}:
                    • position: right
          • OperatorDefinition{http://etl.sf.net/etl/grammar/0.2.1}:
            • name: NotEqual
            • associativity: xfx
            • precedence: 1300
            • text: !=
            • syntax:
              • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                • name: first
                • operator: =
                • expression:
                  • OperandOp{http://etl.sf.net/etl/grammar/0.2.1}:
                    • position: left
              • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                • name: second
                • operator: =
                • expression:
                  • OperandOp{http://etl.sf.net/etl/grammar/0.2.1}:
                    • position: right
          • OperatorDefinition{http://etl.sf.net/etl/grammar/0.2.1}:
            • isComposite:
              • Modifier{http://etl.sf.net/etl/grammar/0.2.1}:
                • value: composite
            • name: RegExLiteral
            • associativity: f
            • syntax:
              • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                • syntax:
                  • ObjectOp{http://etl.sf.net/etl/grammar/0.2.1}:
                    • name:
                      • ObjectName{http://etl.sf.net/etl/grammar/0.2.1}:
                        • prefix: t
                        • name: RegExLiteral
                    • syntax:
                      • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                        • syntax:
                          • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                            • name: value
                            • operator: =
                            • expression:
                              • StringOp{http://etl.sf.net/etl/grammar/0.2.1}:
                                • prefix: R
                                • quote: '"'
          • OperatorDefinition{http://etl.sf.net/etl/grammar/0.2.1}:
            • name: Matches
            • associativity: xfx
            • precedence: 1300
            • text: ==~
            • syntax:
              • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                • name: first
                • operator: =
                • expression:
                  • OperandOp{http://etl.sf.net/etl/grammar/0.2.1}:
                    • position: left
              • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                • name: second
                • operator: =
                • expression:
                  • OperandOp{http://etl.sf.net/etl/grammar/0.2.1}:
                    • position: right
          • OperatorDefinition{http://etl.sf.net/etl/grammar/0.2.1}:
            • name: LogicalNot
            • associativity: fy
            • precedence: 1400
            • text: !
            • syntax:
              • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                • name: value
                • operator: =
                • expression:
                  • OperandOp{http://etl.sf.net/etl/grammar/0.2.1}:
                    • position: right
          • OperatorDefinition{http://etl.sf.net/etl/grammar/0.2.1}:
            • name: ConditionalAnd
            • associativity: yfx
            • precedence: 1500
            • text: &&
            • syntax:
              • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                • name: first
                • operator: =
                • expression:
                  • OperandOp{http://etl.sf.net/etl/grammar/0.2.1}:
                    • position: left
              • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                • name: second
                • operator: =
                • expression:
                  • OperandOp{http://etl.sf.net/etl/grammar/0.2.1}:
                    • position: right
          • OperatorDefinition{http://etl.sf.net/etl/grammar/0.2.1}:
            • name: ConditionalOr
            • associativity: yfx
            • precedence: 1600
            • text: ||
            • syntax:
              • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                • name: first
                • operator: =
                • expression:
                  • OperandOp{http://etl.sf.net/etl/grammar/0.2.1}:
                    • position: left
              • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                • name: second
                • operator: =
                • expression:
                  • OperandOp{http://etl.sf.net/etl/grammar/0.2.1}:
                    • position: right
          • OperatorDefinition{http://etl.sf.net/etl/grammar/0.2.1}:
            • isComposite:
              • Modifier{http://etl.sf.net/etl/grammar/0.2.1}:
                • value: composite
            • name: IfExpression
            • associativity: f
            • precedence: 1700
            • syntax:
              • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                • syntax:
                  • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                    • syntax:
                      • KeywordStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                        • text: if
                      • KeywordStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                        • text: (
              • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                • name: condition
                • operator: =
                • expression:
                  • ExpressionRef{http://etl.sf.net/etl/grammar/0.2.1}:
                • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                  • syntax:
                    • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                      • syntax:
                        • KeywordStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                          • text: )
                • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                  • name: thenPart
                  • operator: =
                  • expression:
                    • ExpressionRef{http://etl.sf.net/etl/grammar/0.2.1}:
                      • precedence: 1700
                • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                  • syntax:
                    • OptionalOp{http://etl.sf.net/etl/grammar/0.2.1}:
                      • syntax:
                        • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                          • syntax:
                            • KeywordStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                              • text: else
                            • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                              • name: elsePart
                              • operator: =
                              • expression:
                                • ExpressionRef{http://etl.sf.net/etl/grammar/0.2.1}:
                                  • precedence: 1700
            • OperatorDefinition{http://etl.sf.net/etl/grammar/0.2.1}:
              • isComposite:
                • Modifier{http://etl.sf.net/etl/grammar/0.2.1}:
                  • value: composite
              • name: IfExpressionCStyle
              • associativity: xfy
              • precedence: 1700
              • syntax:
                • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                  • syntax:
                    • ObjectOp{http://etl.sf.net/etl/grammar/0.2.1}:
                      • name:
                        • ObjectName{http://etl.sf.net/etl/grammar/0.2.1}:
                          • prefix: l
                          • name: IfExpression
                      • syntax:
                        • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                          • syntax:
                            • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                              • name: condition
                              • operator: =
                              • expression:
                                • OperandOp{http://etl.sf.net/etl/grammar/0.2.1}:
                                  • position: left
                            • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                              • syntax:
                                • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                                  • syntax:
                                    • KeywordStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                                      • text: ?
                            • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                              • name: thenPart
                              • operator: =
                              • expression:
                                • ExpressionRef{http://etl.sf.net/etl/grammar/0.2.1}:
                              • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                                • syntax:
                                  • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                                    • syntax:
                                      • KeywordStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                                        • text: :
                              • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                                • name: elsePart
                                • operator: =
                                • expression:
                                  • OperandOp{http://etl.sf.net/etl/grammar/0.2.1}:
                                    • position: right
              • OperatorDefinition{http://etl.sf.net/etl/grammar/0.2.1}:
                • isComposite:
                  • Modifier{http://etl.sf.net/etl/grammar/0.2.1}:
                    • value: composite
                • name: Match
                • associativity: xf
                • precedence: 1700
                • syntax:
                  • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                    • name: value
                    • operator: =
                    • expression:
                      • OperandOp{http://etl.sf.net/etl/grammar/0.2.1}:
                        • position: left
                  • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                    • syntax:
                      • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                        • syntax:
                          • KeywordStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                            • text: match
                  • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                    • name: selectors
                    • operator: +=
                    • expression:
                      • BlockRef{http://etl.sf.net/etl/grammar/0.2.1}:
                        • context: matchSelectors
              • OperatorDefinition{http://etl.sf.net/etl/grammar/0.2.1}:
                • isComposite:
                  • Modifier{http://etl.sf.net/etl/grammar/0.2.1}:
                    • value: composite
                • name: Select
                • associativity: f
                • syntax:
                  • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                    • syntax:
                      • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                        • syntax:
                          • KeywordStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                            • text: select
                  • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                    • name: selectors
                    • operator: +=
                    • expression:
                      • BlockRef{http://etl.sf.net/etl/grammar/0.2.1}:
                        • context: selectSelectors
              • Statement{http://etl.sf.net/etl/grammar/0.2.1}:
                • name: WhileStatement
                • syntax:
                  • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                    • syntax:
                      • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                        • syntax:
                          • KeywordStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                            • text: while
                  • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                    • name: label
                    • operator: =
                    • expression:
                      • OptionalOp{http://etl.sf.net/etl/grammar/0.2.1}:
                        • syntax:
                          • IdentifierOp{http://etl.sf.net/etl/grammar/0.2.1}:
                    • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                      • syntax:
                        • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                          • syntax:
                            • KeywordStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                              • text: (
                    • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                      • name: condition
                      • operator: =
                      • expression:
                        • ExpressionRef{http://etl.sf.net/etl/grammar/0.2.1}:
                      • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                        • syntax:
                          • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                            • syntax:
                              • KeywordStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                                • text: )
                      • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                        • name: body
                        • operator: =
                        • expression:
                          • ExpressionRef{http://etl.sf.net/etl/grammar/0.2.1}:
                    • Statement{http://etl.sf.net/etl/grammar/0.2.1}:
                      • name: BreakStatement
                      • syntax:
                        • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                          • syntax:
                            • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                              • syntax:
                                • KeywordStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                                  • text: break
                        • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                          • name: label
                          • operator: =
                          • expression:
                            • OptionalOp{http://etl.sf.net/etl/grammar/0.2.1}:
                              • syntax:
                                • IdentifierOp{http://etl.sf.net/etl/grammar/0.2.1}:
                      • Statement{http://etl.sf.net/etl/grammar/0.2.1}:
                        • name: ContinueStatement
                        • syntax:
                          • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                            • syntax:
                              • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                                • syntax:
                                  • KeywordStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                                    • text: continue
                          • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                            • name: label
                            • operator: =
                            • expression:
                              • OptionalOp{http://etl.sf.net/etl/grammar/0.2.1}:
                                • syntax:
                                  • IdentifierOp{http://etl.sf.net/etl/grammar/0.2.1}:
                        • Statement{http://etl.sf.net/etl/grammar/0.2.1}:
                          • name: AssertStatement
                          • syntax:
                            • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                              • syntax:
                                • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                                  • syntax:
                                    • KeywordStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                                      • text: assert
                            • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                              • name: condition
                              • operator: =
                              • expression:
                                • ExpressionRef{http://etl.sf.net/etl/grammar/0.2.1}:
                              • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                                • syntax:
                                  • OptionalOp{http://etl.sf.net/etl/grammar/0.2.1}:
                                    • syntax:
                                      • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                                        • syntax:
                                          • KeywordStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                                            • text: :
                                          • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                                            • name: message
                                            • operator: =
                                            • expression:
                                              • ExpressionRef{http://etl.sf.net/etl/grammar/0.2.1}:
                        • Context{http://etl.sf.net/etl/grammar/0.2.1}:
                          • name: Selectors
                          • content:
                            • ContextImport{http://etl.sf.net/etl/grammar/0.2.1}:
                              • localName: expressions
                              • contextName: Expressions
                            • Statement{http://etl.sf.net/etl/grammar/0.2.1}:
                              • name: CasePart
                              • syntax:
                                • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                                  • name: selector
                                  • operator: =
                                  • expression:
                                    • ExpressionRef{http://etl.sf.net/etl/grammar/0.2.1}:
                                      • context: expressions
                                • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                                  • syntax:
                                    • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                                      • syntax:
                                        • KeywordStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                                          • text: =>
                                • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                                  • name: value
                                  • operator: =
                                  • expression:
                                    • ExpressionRef{http://etl.sf.net/etl/grammar/0.2.1}:
                                      • context: expressions
                            • Statement{http://etl.sf.net/etl/grammar/0.2.1}:
                              • name: ElsePart
                              • syntax:
                                • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                                  • syntax:
                                    • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                                      • syntax:
                                        • KeywordStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                                          • text: else
                                • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                                  • name: value
                                  • operator: =
                                  • expression:
                                    • ExpressionRef{http://etl.sf.net/etl/grammar/0.2.1}:
                                      • context: expressions
                         1: doctype public "-//IDN etl.sf.net//ETL//Grammar 0.2.1";
                         2: grammar calculator.CalculatorLogic {
                         3:     include "calculator-vars-0_2_1.g.etl";
                         4:     namespace t = "http://etl.sf.net/samples/calculator";
                         5:     namespace default l = "http://etl.sf.net/samples/calculator/logic";
                         6:     context default Expressions {
                         7:         import matchSelectors = Selectors;
                         8:         import selectSelectors = Selectors;
                         9:         
                        10:         op composite BooleanLiteral(f) {
                        11:             ^ t:BooleanLiteral {
                        12:                 @ value = token(true) | token(false);
                        13:             };
                        14:         };
                        15:         op LessThen(xfx, 1200, <) {
                        16:             @ first = left;
                        17:             @ second = right;
                        18:         };
                        19:         op LessOrEqual(xfx, 1200, <=) {
                        20:             @ first = left;
                        21:             @ second = right;
                        22:         };
                        23:         op MoreThen(xfx, 1200, >) {
                        24:             @ first = left;
                        25:             @ second = right;
                        26:         };
                        27:         op MoreOrEqual(xfx, 1200, >=) {
                        28:             @ first = left;
                        29:             @ second = right;
                        30:         };
                        31:         op Equal(xfx, 1300, ==) {
                        32:             @ first = left;
                        33:             @ second = right;
                        34:         };
                        35:         op NotEqual(xfx, 1300, !=) {
                        36:             @ first = left;
                        37:             @ second = right;
                        38:         };
                        39:         op composite RegExLiteral(f) {
                        40:             ^t:RegExLiteral {
                        41:                 @ value = string(prefix=R, quote='"');
                        42:             };
                        43:         };
                        44:         op Matches(xfx, 1300, ==~) {
                        45:             @ first = left;
                        46:             @ second = right;
                        47:         };
                        48:         op LogicalNot(fy, 1400, !) {
                        49:             @ value = right;
                        50:         };
                        51:         op ConditionalAnd(yfx, 1500, &&) {
                        52:             @ first = left;
                        53:             @ second = right;
                        54:         };
                        55:         op ConditionalOr(yfx, 1600, ||) {
                        56:             @ first = left;
                        57:             @ second = right;
                        58:         };
                        59:         op composite IfExpression(f, 1700) {
                        60:             % if % (;
                        61:             @ condition = expression;
                        62:             %);
                        63:             @ thenPart = expression(precedence = 1700);
                        64:             % else {
                        65:                 @ elsePart = expression(precedence = 1700);
                        66:             } ?;
                        67:         };
                        68:         op composite IfExpressionCStyle(xfy,1700) {
                        69:             ^ l:IfExpression {
                        70:                 @ condition = left;
                        71:                 % ?;
                        72:                 @ thenPart = expression;
                        73:                 % :;
                        74:                 @ elsePart = right;
                        75:             };
                        76:         };
                        77:         op composite Match(xf, 1700) {
                        78:             @ value = left;
                        79:             % match;
                        80:             @ selectors += block(matchSelectors);
                        81:         };
                        82:         op composite Select(f) {
                        83:             % select;
                        84:             @ selectors += block(selectSelectors);
                        85:         };
                        86:         statement WhileStatement{
                        87:             % while;
                        88:             @ label = identifier?;
                        89:             % (;
                        90:             @ condition = expression;
                        91:             % );
                        92:             @ body = expression;
                        93:         };
                        94:         statement BreakStatement {
                        95:             % break;
                        96:             @ label = identifier?;
                        97:         };
                        98:         statement ContinueStatement {
                        99:             % continue;
                       100:             @ label = identifier?;
                       101:         };
                       102:         statement AssertStatement {
                       103:             % assert;
                       104:             @ condition = expression;
                       105:             % : {
                       106:                 @ message = expression;
                       107:             } ?;
                       108:         };
                       109:     };
                       110:     context Selectors {
                       111:         import expressions = Expressions;
                       112:         statement CasePart {
                       113:             @ selector = expression(expressions);
                       114:             % =>;
                       115:             @ value = expression(expressions); 
                       116:         };
                       117:         statement ElsePart {
                       118:             % else;
                       119:             @ value = expression(expressions);
                       120:         };
                       121:     };
                       122: };