• 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}:
    • abstractModifier:
      • Modifier{http://etl.sf.net/etl/grammar/0.2.1}:
        • value: abstract
    • name:
      • calculator
      • CalculatorLambdaBasic
    • content:
      • GrammarInclude{http://etl.sf.net/etl/grammar/0.2.1}:
        • systemId: "calculator-logic-0_2_1.g.etl"
      • 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: EpxressionDef
            • syntax:
              • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                • syntax:
                  • ExpressionRef{http://etl.sf.net/etl/grammar/0.2.1}:
                    • context: Expressions
          • Def{http://etl.sf.net/etl/grammar/0.2.1}:
            • name: ParameterList
            • syntax:
              • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                • name: parameters
                • operator: +=
                • expression:
                  • OptionalOp{http://etl.sf.net/etl/grammar/0.2.1}:
                    • syntax:
                      • ListOp{http://etl.sf.net/etl/grammar/0.2.1}:
                        • separator: ,
                        • syntax:
                          • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                            • 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: Parameter
                                    • syntax:
                                      • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                                        • syntax:
                                          • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                                            • syntax:
                                              • ModifiersOp{http://etl.sf.net/etl/grammar/0.2.1}:
                                                • modifiers:
                                                  • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                                                    • name: type
                                                    • operator: =
                                                    • expression:
                                                      • ModifierOp{http://etl.sf.net/etl/grammar/0.2.1}:
                                                        • value: var
                                          • 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
          • Def{http://etl.sf.net/etl/grammar/0.2.1}:
            • name: LetRecAssignDef
            • 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:
                          • 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
                          • 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:
                              • 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: Lambda
            • associativity: fy
            • precedence: 1950
            • 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:
                  • ChoiceOp{http://etl.sf.net/etl/grammar/0.2.1}:
                    • options:
                      • RefOp{http://etl.sf.net/etl/grammar/0.2.1}:
                        • name: ParameterList
                    • options:
                      • 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
                          • KeywordStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                            • text: )
              • 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
          • OperatorDefinition{http://etl.sf.net/etl/grammar/0.2.1}:
            • isComposite:
              • Modifier{http://etl.sf.net/etl/grammar/0.2.1}:
                • value: composite
            • name: Apply
            • associativity: yf
            • precedence: 100
            • 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
              • 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: arguments
                • operator: +=
                • expression:
                  • OptionalOp{http://etl.sf.net/etl/grammar/0.2.1}:
                    • syntax:
                      • ListOp{http://etl.sf.net/etl/grammar/0.2.1}:
                        • separator: ,
                        • syntax:
                          • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                            • syntax:
                              • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                                • syntax:
                                  • 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: )
            • Statement{http://etl.sf.net/etl/grammar/0.2.1}:
              • name: LetRec
              • 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:
                            • 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: letrec
                            • Let{http://etl.sf.net/etl/grammar/0.2.1}:
                              • name: definitions
                              • operator: +=
                              • expression:
                                • ChoiceOp{http://etl.sf.net/etl/grammar/0.2.1}:
                                  • options:
                                    • RefOp{http://etl.sf.net/etl/grammar/0.2.1}:
                                      • name: LetRecAssignDef
                                  • options:
                                    • Sequence{http://etl.sf.net/etl/grammar/0.2.1}:
                                      • syntax:
                                        • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                                          • syntax:
                                            • BlockRef{http://etl.sf.net/etl/grammar/0.2.1}:
                                              • context: letRecContent
        • Context{http://etl.sf.net/etl/grammar/0.2.1}:
          • name: LetRecContent
          • content:
            • ContextInclude{http://etl.sf.net/etl/grammar/0.2.1}:
              • contextName: LetRecDefs
            • ContextInclude{http://etl.sf.net/etl/grammar/0.2.1}:
              • contextName: MetaInformation
            • ContextImport{http://etl.sf.net/etl/grammar/0.2.1}:
              • localName: expressions
              • contextName: Expressions
            • Def{http://etl.sf.net/etl/grammar/0.2.1}:
              • name: EpxressionDef
              • syntax:
                • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                  • syntax:
                    • ExpressionRef{http://etl.sf.net/etl/grammar/0.2.1}:
                      • context: expressions
            • Statement{http://etl.sf.net/etl/grammar/0.2.1}:
              • name: LetPart
              • syntax:
                • ExpressionStatement{http://etl.sf.net/etl/grammar/0.2.1}:
                  • syntax:
                    • RefOp{http://etl.sf.net/etl/grammar/0.2.1}:
                      • name: LetRecAssignDef
         1: doctype public "-//IDN etl.sf.net//ETL//Grammar 0.2.1";
         2: grammar abstract calculator.CalculatorLambdaBasic {
         3:     include "calculator-logic-0_2_1.g.etl";
         4:     namespace v = "http://etl.sf.net/samples/calculator/vars";
         5:     namespace default l = "http://etl.sf.net/samples/calculator/lambda";
         6:     context abstract LetRecDefs {
         7:         def EpxressionDef {
         8:             // redefine it to refer to the correct expression
         9:             expression(Expressions);
        10:         };
        11:         def ParameterList {
        12:             @ parameters += list , {
        13:                 ^l:Parameter {
        14:                     modifiers {
        15:                         @ type = modifier var;
        16:                     };
        17:                     @ name = ref(NameDef);
        18:                 };
        19:             } ?;
        20:         };
        21:         def LetRecAssignDef {
        22:             ^v:LetRecPart {
        23:                 @ name = ref(NameDef);
        24:                 % =;
        25:                 @ value = ref(ExpressionDef);
        26:             };
        27:         };
        28:     };
        29:     context default Expressions {
        30:         include LetRecDefs;
        31:         import letRecContent = LetRecContent;
        32:         
        33:         op composite Lambda(fy, 1950) {
        34:             % \;
        35:             ref(ParameterList) | %( { ref(ParameterList); } % );
        36:             % =>;
        37:             @ value = right;
        38:         };
        39:         op composite Apply(yf, 100) {
        40:             @ function = left;
        41:             % (;
        42:             @ arguments += list , {
        43:                 expression;
        44:             } ?;
        45:             % );
        46:         };
        47:         statement LetRec {
        48:             ^ v:LetRec {
        49:                 % letrec;
        50:                 @ definitions += ref(LetRecAssignDef) | {
        51:                     block(letRecContent);
        52:                 };
        53:             };
        54:         };
        55:     };
        56:     context LetRecContent {
        57:         include LetRecDefs;
        58:         include MetaInformation;
        59:         import expressions = Expressions;
        60:         
        61:         def EpxressionDef {
        62:             expression(expressions);
        63:         };        
        64:         statement LetPart {
        65:             ref(LetRecAssignDef);
        66:         };
        67:     };
        68: };