• 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
      • CalculatorLambda
    • content:
      • GrammarInclude{http://etl.sf.net/etl/grammar/0.2.1}:
        • systemId: "calculator-lambda-basic-0_2_1.g.etl"
      • Namespace{http://etl.sf.net/etl/grammar/0.2.1}:
        • prefix: t
        • uri: "http://etl.sf.net/samples/calculator/vars"
      • Namespace{http://etl.sf.net/etl/grammar/0.2.1}:
        • prefix: v
        • uri: "http://etl.sf.net/samples/calculator/vars"
      • 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/lambda"
      • Context{http://etl.sf.net/etl/grammar/0.2.1}:
        • abstractModifier:
          • Modifier{http://etl.sf.net/etl/grammar/0.2.1}:
            • value: abstract
        • name: LetRecDefs
        • content:
          • Def{http://etl.sf.net/etl/grammar/0.2.1}:
            • name: LetRecFunctionDef
            • 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: v
                        • name: LetRecPart
                    • syntax:
                      • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                        • 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: to
                          • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                            • name: name
                            • operator: =
                            • expression:
                              • RefOp{http://etl.sf.net/etl/grammar/0.2.1}:
                                • name: NameDef
                          • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                            • name: value
                            • operator: =
                            • expression:
                              • ObjectOp{http://etl.sf.net/etl/grammar/0.2.1}:
                                • name:
                                  • ObjectName{http://etl.sf.net/etl/grammar/0.2.1}:
                                    • prefix: l
                                    • name: Lambda
                                • syntax:
                                  • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                                    • 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: (
                                      • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                                        • syntax:
                                          • RefOp{http://etl.sf.net/etl/grammar/0.2.1}:
                                            • name: ParameterList
                                      • 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: )
                                              • 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:
                                          • RefOp{http://etl.sf.net/etl/grammar/0.2.1}:
                                            • name: ExpressionDef
      • 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:
          • ContextInclude{http://etl.sf.net/etl/grammar/0.2.1}:
            • contextName: LetRecDefs
          • ContextImport{http://etl.sf.net/etl/grammar/0.2.1}:
            • localName: letRecContent
            • contextName: LetRecContent
          • OperatorDefinition{http://etl.sf.net/etl/grammar/0.2.1}:
            • isComposite:
              • Modifier{http://etl.sf.net/etl/grammar/0.2.1}:
                • value: composite
            • name: LambdaNoArgs
            • associativity: fy
            • precedence: 1950
            • 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: Lambda
                    • syntax:
                      • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                        • 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: \>
                          • 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
          • Def{http://etl.sf.net/etl/grammar/0.2.1}:
            • name: SequenceDef
            • 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: LambdaSequence
                    • syntax:
                      • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                        • syntax:
                          • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                            • name: statements
                            • operator: +=
                            • expression:
                              • BlockRef{http://etl.sf.net/etl/grammar/0.2.1}:
            • Statement{http://etl.sf.net/etl/grammar/0.2.1}:
              • name: BlockParameters
              • 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: ?
                • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                  • syntax:
                    • RefOp{http://etl.sf.net/etl/grammar/0.2.1}:
                      • name: ParameterList
            • Statement{http://etl.sf.net/etl/grammar/0.2.1}:
              • name: Function
              • 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: v
                          • name: LetRec
                      • syntax:
                        • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                          • syntax:
                            • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                              • name: definitions
                              • operator: +=
                              • expression:
                                • RefOp{http://etl.sf.net/etl/grammar/0.2.1}:
                                  • name: LetRecFunctionDef
            • OperatorDefinition{http://etl.sf.net/etl/grammar/0.2.1}:
              • isComposite:
                • Modifier{http://etl.sf.net/etl/grammar/0.2.1}:
                  • value: composite
              • name: InfixOperatorAppy
              • associativity: yfx
              • precedence: 1150
              • 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: Apply
                      • syntax:
                        • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                          • syntax:
                            • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                              • name: arguments
                              • 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: function
                              • operator: =
                              • expression:
                                • ExpressionRef{http://etl.sf.net/etl/grammar/0.2.1}:
                                  • precedence: 99
                            • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                              • name: arguments
                              • 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: PrefixOperatorAppy
              • associativity: fy
              • precedence: 1150
              • 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: Apply
                      • syntax:
                        • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                          • 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: #
                            • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                              • name: function
                              • operator: =
                              • expression:
                                • ExpressionRef{http://etl.sf.net/etl/grammar/0.2.1}:
                                  • precedence: 99
                            • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                              • name: arguments
                              • 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: ApplyBlock
              • associativity: xf
              • precedence: 1175
              • 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: Apply
                      • syntax:
                        • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                          • syntax:
                            • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                              • name: function
                              • 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: arguments
                              • operator: +=
                              • expression:
                                • RefOp{http://etl.sf.net/etl/grammar/0.2.1}:
                                  • name: SequenceDef
            • OperatorDefinition{http://etl.sf.net/etl/grammar/0.2.1}:
              • isComposite:
                • Modifier{http://etl.sf.net/etl/grammar/0.2.1}:
                  • value: composite
              • name: Lazy
              • associativity: f
              • precedence: 1950
              • 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: Apply
                      • syntax:
                        • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                          • syntax:
                            • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                              • name: function
                              • operator: =
                              • expression:
                                • TokenOp{http://etl.sf.net/etl/grammar/0.2.1}:
                                  • value: &
                                  • wrapper:
                                    • Wrapper{http://etl.sf.net/etl/grammar/0.2.1}:
                                      • object:
                                        • ObjectName{http://etl.sf.net/etl/grammar/0.2.1}:
                                          • prefix: t
                                          • name: Name
                                      • property: literal
                            • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                              • name: arguments
                              • operator: +=
                              • expression:
                                • ObjectOp{http://etl.sf.net/etl/grammar/0.2.1}:
                                  • name:
                                    • ObjectName{http://etl.sf.net/etl/grammar/0.2.1}:
                                      • prefix: l
                                      • name: Lambda
                                  • 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:
                                            • ExpressionRef{http://etl.sf.net/etl/grammar/0.2.1}:
                                              • precedence: 1949
            • OperatorDefinition{http://etl.sf.net/etl/grammar/0.2.1}:
              • name: Dereference
              • associativity: fy
              • precedence: 100
              • 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}:
              • isComposite:
                • Modifier{http://etl.sf.net/etl/grammar/0.2.1}:
                  • value: composite
              • name: NotEqualDeref
              • associativity: xfx
              • precedence: 1300
              • 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: Apply
                      • syntax:
                        • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                          • syntax:
                            • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                              • name: arguments
                              • 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: function
                              • operator: =
                              • expression:
                                • TokenOp{http://etl.sf.net/etl/grammar/0.2.1}:
                                  • value: !*=
                                  • wrapper:
                                    • Wrapper{http://etl.sf.net/etl/grammar/0.2.1}:
                                      • object:
                                        • ObjectName{http://etl.sf.net/etl/grammar/0.2.1}:
                                          • prefix: t
                                          • name: Name
                                      • property: literal
                            • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                              • name: arguments
                              • 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: EqualDeref
              • associativity: xfx
              • precedence: 1300
              • 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: Apply
                      • syntax:
                        • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                          • syntax:
                            • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                              • name: arguments
                              • 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: function
                              • operator: =
                              • expression:
                                • TokenOp{http://etl.sf.net/etl/grammar/0.2.1}:
                                  • value: =*=
                                  • wrapper:
                                    • Wrapper{http://etl.sf.net/etl/grammar/0.2.1}:
                                      • object:
                                        • ObjectName{http://etl.sf.net/etl/grammar/0.2.1}:
                                          • prefix: t
                                          • name: Name
                                      • property: literal
                            • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                              • name: arguments
                              • operator: +=
                              • expression:
                                • OperandOp{http://etl.sf.net/etl/grammar/0.2.1}:
                                  • position: right
        • Context{http://etl.sf.net/etl/grammar/0.2.1}:
          • name: LetRecContent
          • content:
            • Statement{http://etl.sf.net/etl/grammar/0.2.1}:
              • name: FunctionPart
              • syntax:
                • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                  • syntax:
                    • RefOp{http://etl.sf.net/etl/grammar/0.2.1}:
                      • name: LetRecFunctionDef
         1: doctype public "-//IDN etl.sf.net//ETL//Grammar 0.2.1";
         2: grammar calculator.CalculatorLambda {
         3:     include "calculator-lambda-basic-0_2_1.g.etl";
         4:     namespace t = "http://etl.sf.net/samples/calculator/vars";
         5:     namespace v = "http://etl.sf.net/samples/calculator/vars";
         6:     namespace default l = "http://etl.sf.net/samples/calculator/lambda";
         7:     context abstract LetRecDefs {
         8:         def LetRecFunctionDef {
         9:             ^ v:LetRecPart {
        10:                 % to;
        11:                 @ name = ref(NameDef);
        12:                 @ value = ^l:Lambda {
        13:                     % (;
        14:                     ref(ParameterList);
        15:                     % ) % =>;
        16:                     @ value = ref(ExpressionDef);
        17:                 };
        18:             };
        19:         };        
        20:     };
        21:     context default Expressions {
        22:         include LetRecDefs;
        23:         import letRecContent = LetRecContent;
        24:         
        25:         op composite LambdaNoArgs(fy, 1950) {
        26:             ^ l:Lambda {
        27:                 % \>;
        28:                 @ value = right;
        29:             };
        30:         };        
        31:         def SequenceDef {
        32:             ^ l:LambdaSequence {
        33:                 @statements += block;
        34:             };
        35:         };
        36:         statement BlockParameters {
        37:             % ?;
        38:             ref(ParameterList);
        39:         };
        40:         statement Function {
        41:             ^v:LetRec {
        42:                 @ definitions += ref(LetRecFunctionDef);
        43:             };
        44:         };
        45:         op composite InfixOperatorAppy(yfx, 1150) {
        46:             ^ l:Apply {
        47:                 @ arguments += left;
        48:                 % #;
        49:                 @ function = expression(precedence = 99);
        50:                 @ arguments += right;
        51:             };
        52:         };        
        53:         op composite PrefixOperatorAppy(fy, 1150) {
        54:             ^ l:Apply {
        55:                 % #;
        56:                 @ function = expression(precedence = 99);
        57:                 @ arguments += right;
        58:             };
        59:         };
        60:         op composite ApplyBlock(xf, 1175) {
        61:             ^ l:Apply {
        62:                 @ function = left;
        63:                 @ arguments += ref(SequenceDef);
        64:             };
        65:         };
        66:         op composite Lazy(f, 1950) {
        67:             ^ l:Apply {
        68:                 @ function = token(&) wrapper t:Name.literal;
        69:                 @ arguments += ^ l:Lambda { 
        70:                     @value = expression(precedence=1949); 
        71:                 };
        72:             };
        73:         };
        74:         op Dereference(fy, 100, *) {
        75:             @ value = right;
        76:         };
        77:         op composite NotEqualDeref(xfx, 1300) {
        78:             ^ l:Apply {
        79:                 @ arguments += left;
        80:                 @ function = token(!*=) wrapper t:Name.literal;
        81:                 @ arguments += right;
        82:             };
        83:         };
        84:         op composite EqualDeref(xfx, 1300) {
        85:             ^ l:Apply {
        86:                 @ arguments += left;
        87:                 @ function = token(=*=) wrapper t:Name.literal;
        88:                 @ arguments += right;
        89:             };
        90:         };
        91:     };
        92:     context LetRecContent {
        93:         statement FunctionPart {
        94:             ref(LetRecFunctionDef);
        95:         };
        96:     };
        97: };