Browse Source

Continuous function added to Mscript grammar.

au@andreasunger.net 14 years ago
parent
commit
e6f3695551
40 changed files with 17686 additions and 15037 deletions
  1. 14 2
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/AbstractMscriptProposalProvider.java
  2. 7 3
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/MscriptParser.java
  3. 250 45
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g
  4. 78 72
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.tokens
  5. 582 479
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscriptLexer.java
  6. 10161 9521
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscriptParser.java
  7. 10 1
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/model/Mscript.ecore
  8. 10 1
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/model/Mscript.genmodel
  9. 254 219
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src-gen/org/eclipselabs/mscript/language/Mscript.xmi
  10. 285 86
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src-gen/org/eclipselabs/mscript/language/parseTreeConstruction/MscriptParsetreeConstructor.java
  11. 123 36
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src-gen/org/eclipselabs/mscript/language/parser/antlr/internal/InternalMscript.g
  12. 45 39
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src-gen/org/eclipselabs/mscript/language/parser/antlr/internal/InternalMscript.tokens
  13. 437 333
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src-gen/org/eclipselabs/mscript/language/parser/antlr/internal/InternalMscriptLexer.java
  14. 4318 4018
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src-gen/org/eclipselabs/mscript/language/parser/antlr/internal/InternalMscriptParser.java
  15. 132 42
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src-gen/org/eclipselabs/mscript/language/services/MscriptGrammarAccess.java
  16. 9 2
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/Mscript.xtext
  17. 9 0
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/AstFactory.java
  18. 189 64
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/AstPackage.java
  19. 54 0
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/DerivativeOperator.java
  20. 27 0
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/Equation.java
  21. 14 11
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/FunctionDefinition.java
  22. 239 0
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/FunctionKind.java
  23. 45 1
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/AstFactoryImpl.java
  24. 72 5
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/AstPackageImpl.java
  25. 0 1
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/BreakStatementImpl.java
  26. 0 1
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/ContinueStatementImpl.java
  27. 158 0
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/DerivativeOperatorImpl.java
  28. 0 4
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/DoWhileStatementImpl.java
  29. 68 0
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/EquationImpl.java
  30. 0 4
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/ForStatementImpl.java
  31. 24 23
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/FunctionDefinitionImpl.java
  32. 0 4
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/IfStatementImpl.java
  33. 0 4
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/ReturnStatementImpl.java
  34. 0 4
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/VariableDeclarationImpl.java
  35. 0 4
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/WhileStatementImpl.java
  36. 27 1
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/util/AstAdapterFactory.java
  37. 31 1
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/util/AstSwitch.java
  38. 9 3
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/functionmodel/construct/FunctionDescriptorConstructor.java
  39. 2 1
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/il/transform/FunctionDefinitionTransformer.java
  40. 3 2
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/validation/MscriptJavaValidator.java

+ 14 - 2
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/AbstractMscriptProposalProvider.java

@@ -47,8 +47,8 @@ public class AbstractMscriptProposalProvider extends AbstractJavaBasedContentPro
 	public void completeRecordFieldDeclaration_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
-	public void completeFunctionDefinition_Stateful(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-		// subclasses may override
+	public void completeFunctionDefinition_Kind(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
 	public void completeFunctionDefinition_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
@@ -119,6 +119,9 @@ public class AbstractMscriptProposalProvider extends AbstractJavaBasedContentPro
 	public void completeFunctionObjectDeclaration_TemplateArguments(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
+	public void completeEquation_Initial(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
 	public void completeEquation_LeftHandSide(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
@@ -357,6 +360,9 @@ public class AbstractMscriptProposalProvider extends AbstractJavaBasedContentPro
 	public void completeStepLiteral_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
+	public void completeDerivativeOperator_Variable(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
 	public void completeArrayConstructionOperator_Expressions(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
@@ -484,6 +490,9 @@ public class AbstractMscriptProposalProvider extends AbstractJavaBasedContentPro
 	public void complete_FunctionDefinition(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
+	public void complete_FunctionKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
 	public void complete_TemplateParameterDeclaration(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
@@ -694,6 +703,9 @@ public class AbstractMscriptProposalProvider extends AbstractJavaBasedContentPro
 	public void complete_StepN(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
+	public void complete_DerivativeOperator(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
 	public void complete_ArrayConstructionOperator(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}

+ 7 - 3
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/MscriptParser.java

@@ -68,6 +68,7 @@ public class MscriptParser extends AbstractContentAssistParser {
 					put(grammarAccess.getValidIntAccess().getAlternatives(), "rule__ValidInt__Alternatives");
 					put(grammarAccess.getValidLongAccess().getAlternatives(), "rule__ValidLong__Alternatives");
 					put(grammarAccess.getValidIDAccess().getAlternatives(), "rule__ValidID__Alternatives");
+					put(grammarAccess.getFunctionKindAccess().getAlternatives(), "rule__FunctionKind__Alternatives");
 					put(grammarAccess.getAssertionStatusKindAccess().getAlternatives(), "rule__AssertionStatusKind__Alternatives");
 					put(grammarAccess.getEqualityOperatorAccess().getAlternatives(), "rule__EqualityOperator__Alternatives");
 					put(grammarAccess.getRelationalOperatorAccess().getAlternatives(), "rule__RelationalOperator__Alternatives");
@@ -172,6 +173,7 @@ public class MscriptParser extends AbstractContentAssistParser {
 					put(grammarAccess.getAdditiveStepExpressionAccess().getGroup_1(), "rule__AdditiveStepExpression__Group_1__0");
 					put(grammarAccess.getNegateStepExpressionAccess().getGroup_1(), "rule__NegateStepExpression__Group_1__0");
 					put(grammarAccess.getStepNAccess().getGroup(), "rule__StepN__Group__0");
+					put(grammarAccess.getDerivativeOperatorAccess().getGroup(), "rule__DerivativeOperator__Group__0");
 					put(grammarAccess.getArrayConstructionOperatorAccess().getGroup(), "rule__ArrayConstructionOperator__Group__0");
 					put(grammarAccess.getArrayConstructionOperatorAccess().getGroup_2_0(), "rule__ArrayConstructionOperator__Group_2_0__0");
 					put(grammarAccess.getArrayConstructionOperatorAccess().getGroup_2_1(), "rule__ArrayConstructionOperator__Group_2_1__0");
@@ -224,7 +226,7 @@ public class MscriptParser extends AbstractContentAssistParser {
 					put(grammarAccess.getRecordDefinitionAccess().getFieldDeclarationsAssignment_3(), "rule__RecordDefinition__FieldDeclarationsAssignment_3");
 					put(grammarAccess.getRecordFieldDeclarationAccess().getNameAssignment_0(), "rule__RecordFieldDeclaration__NameAssignment_0");
 					put(grammarAccess.getRecordFieldDeclarationAccess().getTypeAssignment_2(), "rule__RecordFieldDeclaration__TypeAssignment_2");
-					put(grammarAccess.getFunctionDefinitionAccess().getStatefulAssignment_0(), "rule__FunctionDefinition__StatefulAssignment_0");
+					put(grammarAccess.getFunctionDefinitionAccess().getKindAssignment_0(), "rule__FunctionDefinition__KindAssignment_0");
 					put(grammarAccess.getFunctionDefinitionAccess().getNameAssignment_2(), "rule__FunctionDefinition__NameAssignment_2");
 					put(grammarAccess.getFunctionDefinitionAccess().getTemplateParameterDeclarationsAssignment_3_1(), "rule__FunctionDefinition__TemplateParameterDeclarationsAssignment_3_1");
 					put(grammarAccess.getFunctionDefinitionAccess().getTemplateParameterDeclarationsAssignment_3_2_1(), "rule__FunctionDefinition__TemplateParameterDeclarationsAssignment_3_2_1");
@@ -255,8 +257,9 @@ public class MscriptParser extends AbstractContentAssistParser {
 					put(grammarAccess.getFunctionObjectDeclarationAccess().getFunctionNameAssignment_3(), "rule__FunctionObjectDeclaration__FunctionNameAssignment_3");
 					put(grammarAccess.getFunctionObjectDeclarationAccess().getTemplateArgumentsAssignment_4_1(), "rule__FunctionObjectDeclaration__TemplateArgumentsAssignment_4_1");
 					put(grammarAccess.getFunctionObjectDeclarationAccess().getTemplateArgumentsAssignment_4_2_1(), "rule__FunctionObjectDeclaration__TemplateArgumentsAssignment_4_2_1");
-					put(grammarAccess.getEquationAccess().getLeftHandSideAssignment_0(), "rule__Equation__LeftHandSideAssignment_0");
-					put(grammarAccess.getEquationAccess().getRightHandSideAssignment_2(), "rule__Equation__RightHandSideAssignment_2");
+					put(grammarAccess.getEquationAccess().getInitialAssignment_0(), "rule__Equation__InitialAssignment_0");
+					put(grammarAccess.getEquationAccess().getLeftHandSideAssignment_1(), "rule__Equation__LeftHandSideAssignment_1");
+					put(grammarAccess.getEquationAccess().getRightHandSideAssignment_3(), "rule__Equation__RightHandSideAssignment_3");
 					put(grammarAccess.getDataTypeSpecifierAccess().getDefinedTypeAssignment_0(), "rule__DataTypeSpecifier__DefinedTypeAssignment_0");
 					put(grammarAccess.getDataTypeSpecifierAccess().getTypeAssignment_1(), "rule__DataTypeSpecifier__TypeAssignment_1");
 					put(grammarAccess.getRealTypeAccess().getUnitAssignment_2(), "rule__RealType__UnitAssignment_2");
@@ -344,6 +347,7 @@ public class MscriptParser extends AbstractContentAssistParser {
 					put(grammarAccess.getAdditiveStepExpressionAccess().getRightOperandAssignment_1_2(), "rule__AdditiveStepExpression__RightOperandAssignment_1_2");
 					put(grammarAccess.getNegateStepExpressionAccess().getOperandAssignment_1_2(), "rule__NegateStepExpression__OperandAssignment_1_2");
 					put(grammarAccess.getStepLiteralAccess().getValueAssignment(), "rule__StepLiteral__ValueAssignment");
+					put(grammarAccess.getDerivativeOperatorAccess().getVariableAssignment_1(), "rule__DerivativeOperator__VariableAssignment_1");
 					put(grammarAccess.getArrayConstructionOperatorAccess().getExpressionsAssignment_1(), "rule__ArrayConstructionOperator__ExpressionsAssignment_1");
 					put(grammarAccess.getArrayConstructionOperatorAccess().getExpressionsAssignment_2_0_1(), "rule__ArrayConstructionOperator__ExpressionsAssignment_2_0_1");
 					put(grammarAccess.getArrayConstructionOperatorAccess().getIterationClausesAssignment_2_1_1(), "rule__ArrayConstructionOperator__IterationClausesAssignment_2_1_1");

+ 250 - 45
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g

@@ -2046,6 +2046,34 @@ finally {
 
 
 
+// Entry rule entryRuleDerivativeOperator
+entryRuleDerivativeOperator 
+:
+{ before(grammarAccess.getDerivativeOperatorRule()); }
+	 ruleDerivativeOperator
+{ after(grammarAccess.getDerivativeOperatorRule()); } 
+	 EOF 
+;
+
+// Rule DerivativeOperator
+ruleDerivativeOperator
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getDerivativeOperatorAccess().getGroup()); }
+(rule__DerivativeOperator__Group__0)
+{ after(grammarAccess.getDerivativeOperatorAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
 // Entry rule entryRuleArrayConstructionOperator
 entryRuleArrayConstructionOperator 
 :
@@ -2917,6 +2945,25 @@ finally {
 
 
 
+// Rule FunctionKind
+ruleFunctionKind
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getFunctionKindAccess().getAlternatives()); }
+(rule__FunctionKind__Alternatives)
+{ after(grammarAccess.getFunctionKindAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
 // Rule AssertionStatusKind
 ruleAssertionStatusKind
     @init {
@@ -3478,39 +3525,45 @@ rule__PrimaryExpression__Alternatives
 )
 
     |(
-{ before(grammarAccess.getPrimaryExpressionAccess().getUnitConstructionOperatorParserRuleCall_2()); }
+{ before(grammarAccess.getPrimaryExpressionAccess().getDerivativeOperatorParserRuleCall_2()); }
+	ruleDerivativeOperator
+{ after(grammarAccess.getPrimaryExpressionAccess().getDerivativeOperatorParserRuleCall_2()); }
+)
+
+    |(
+{ before(grammarAccess.getPrimaryExpressionAccess().getUnitConstructionOperatorParserRuleCall_3()); }
 	ruleUnitConstructionOperator
-{ after(grammarAccess.getPrimaryExpressionAccess().getUnitConstructionOperatorParserRuleCall_2()); }
+{ after(grammarAccess.getPrimaryExpressionAccess().getUnitConstructionOperatorParserRuleCall_3()); }
 )
 
     |(
-{ before(grammarAccess.getPrimaryExpressionAccess().getArrayConstructionOperatorParserRuleCall_3()); }
+{ before(grammarAccess.getPrimaryExpressionAccess().getArrayConstructionOperatorParserRuleCall_4()); }
 	ruleArrayConstructionOperator
-{ after(grammarAccess.getPrimaryExpressionAccess().getArrayConstructionOperatorParserRuleCall_3()); }
+{ after(grammarAccess.getPrimaryExpressionAccess().getArrayConstructionOperatorParserRuleCall_4()); }
 )
 
     |(
-{ before(grammarAccess.getPrimaryExpressionAccess().getArrayConcatenationOperatorParserRuleCall_4()); }
+{ before(grammarAccess.getPrimaryExpressionAccess().getArrayConcatenationOperatorParserRuleCall_5()); }
 	ruleArrayConcatenationOperator
-{ after(grammarAccess.getPrimaryExpressionAccess().getArrayConcatenationOperatorParserRuleCall_4()); }
+{ after(grammarAccess.getPrimaryExpressionAccess().getArrayConcatenationOperatorParserRuleCall_5()); }
 )
 
     |(
-{ before(grammarAccess.getPrimaryExpressionAccess().getParenthesizedExpressionParserRuleCall_5()); }
+{ before(grammarAccess.getPrimaryExpressionAccess().getParenthesizedExpressionParserRuleCall_6()); }
 	ruleParenthesizedExpression
-{ after(grammarAccess.getPrimaryExpressionAccess().getParenthesizedExpressionParserRuleCall_5()); }
+{ after(grammarAccess.getPrimaryExpressionAccess().getParenthesizedExpressionParserRuleCall_6()); }
 )
 
     |(
-{ before(grammarAccess.getPrimaryExpressionAccess().getEndExpressionParserRuleCall_6()); }
+{ before(grammarAccess.getPrimaryExpressionAccess().getEndExpressionParserRuleCall_7()); }
 	ruleEndExpression
-{ after(grammarAccess.getPrimaryExpressionAccess().getEndExpressionParserRuleCall_6()); }
+{ after(grammarAccess.getPrimaryExpressionAccess().getEndExpressionParserRuleCall_7()); }
 )
 
     |(
-{ before(grammarAccess.getPrimaryExpressionAccess().getAlgorithmExpressionParserRuleCall_7()); }
+{ before(grammarAccess.getPrimaryExpressionAccess().getAlgorithmExpressionParserRuleCall_8()); }
 	ruleAlgorithmExpression
-{ after(grammarAccess.getPrimaryExpressionAccess().getAlgorithmExpressionParserRuleCall_7()); }
+{ after(grammarAccess.getPrimaryExpressionAccess().getAlgorithmExpressionParserRuleCall_8()); }
 )
 
 ;
@@ -3910,6 +3963,30 @@ finally {
 	restoreStackSize(stackSize);
 }
 
+rule__FunctionKind__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getFunctionKindAccess().getStatefulEnumLiteralDeclaration_0()); }
+(	'stateful' 
+)
+{ after(grammarAccess.getFunctionKindAccess().getStatefulEnumLiteralDeclaration_0()); }
+)
+
+    |(
+{ before(grammarAccess.getFunctionKindAccess().getContinuousEnumLiteralDeclaration_1()); }
+(	'continuous' 
+)
+{ after(grammarAccess.getFunctionKindAccess().getContinuousEnumLiteralDeclaration_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
 rule__AssertionStatusKind__Alternatives
     @init {
 		int stackSize = keepStackSize();
@@ -4871,9 +4948,9 @@ rule__FunctionDefinition__Group__0__Impl
     }
 :
 (
-{ before(grammarAccess.getFunctionDefinitionAccess().getStatefulAssignment_0()); }
-(rule__FunctionDefinition__StatefulAssignment_0)?
-{ after(grammarAccess.getFunctionDefinitionAccess().getStatefulAssignment_0()); }
+{ before(grammarAccess.getFunctionDefinitionAccess().getKindAssignment_0()); }
+(rule__FunctionDefinition__KindAssignment_0)?
+{ after(grammarAccess.getFunctionDefinitionAccess().getKindAssignment_0()); }
 )
 
 ;
@@ -7026,9 +7103,9 @@ rule__Equation__Group__0__Impl
     }
 :
 (
-{ before(grammarAccess.getEquationAccess().getLeftHandSideAssignment_0()); }
-(rule__Equation__LeftHandSideAssignment_0)
-{ after(grammarAccess.getEquationAccess().getLeftHandSideAssignment_0()); }
+{ before(grammarAccess.getEquationAccess().getInitialAssignment_0()); }
+(rule__Equation__InitialAssignment_0)?
+{ after(grammarAccess.getEquationAccess().getInitialAssignment_0()); }
 )
 
 ;
@@ -7055,11 +7132,9 @@ rule__Equation__Group__1__Impl
     }
 :
 (
-{ before(grammarAccess.getEquationAccess().getEqualsSignKeyword_1()); }
-
-	'=' 
-
-{ after(grammarAccess.getEquationAccess().getEqualsSignKeyword_1()); }
+{ before(grammarAccess.getEquationAccess().getLeftHandSideAssignment_1()); }
+(rule__Equation__LeftHandSideAssignment_1)
+{ after(grammarAccess.getEquationAccess().getLeftHandSideAssignment_1()); }
 )
 
 ;
@@ -7086,9 +7161,11 @@ rule__Equation__Group__2__Impl
     }
 :
 (
-{ before(grammarAccess.getEquationAccess().getRightHandSideAssignment_2()); }
-(rule__Equation__RightHandSideAssignment_2)
-{ after(grammarAccess.getEquationAccess().getRightHandSideAssignment_2()); }
+{ before(grammarAccess.getEquationAccess().getEqualsSignKeyword_2()); }
+
+	'=' 
+
+{ after(grammarAccess.getEquationAccess().getEqualsSignKeyword_2()); }
 )
 
 ;
@@ -7103,6 +7180,7 @@ rule__Equation__Group__3
     }
 :
 	rule__Equation__Group__3__Impl
+	rule__Equation__Group__4
 ;
 finally {
 	restoreStackSize(stackSize);
@@ -7114,11 +7192,39 @@ rule__Equation__Group__3__Impl
     }
 :
 (
-{ before(grammarAccess.getEquationAccess().getSemicolonKeyword_3()); }
+{ before(grammarAccess.getEquationAccess().getRightHandSideAssignment_3()); }
+(rule__Equation__RightHandSideAssignment_3)
+{ after(grammarAccess.getEquationAccess().getRightHandSideAssignment_3()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Equation__Group__4
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Equation__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Equation__Group__4__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEquationAccess().getSemicolonKeyword_4()); }
 
 	';' 
 
-{ after(grammarAccess.getEquationAccess().getSemicolonKeyword_3()); }
+{ after(grammarAccess.getEquationAccess().getSemicolonKeyword_4()); }
 )
 
 ;
@@ -7135,6 +7241,8 @@ finally {
 
 
 
+
+
 rule__RealType__Group__0
     @init {
 		int stackSize = keepStackSize();
@@ -13848,6 +13956,69 @@ finally {
 
 
 
+rule__DerivativeOperator__Group__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__DerivativeOperator__Group__0__Impl
+	rule__DerivativeOperator__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DerivativeOperator__Group__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getDerivativeOperatorAccess().getDerKeyword_0()); }
+
+	'der' 
+
+{ after(grammarAccess.getDerivativeOperatorAccess().getDerKeyword_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DerivativeOperator__Group__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__DerivativeOperator__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DerivativeOperator__Group__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getDerivativeOperatorAccess().getVariableAssignment_1()); }
+(rule__DerivativeOperator__VariableAssignment_1)
+{ after(grammarAccess.getDerivativeOperatorAccess().getVariableAssignment_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
 rule__ArrayConstructionOperator__Group__0
     @init {
 		int stackSize = keepStackSize();
@@ -17918,22 +18089,14 @@ finally {
 	restoreStackSize(stackSize);
 }
 
-rule__FunctionDefinition__StatefulAssignment_0
+rule__FunctionDefinition__KindAssignment_0
     @init {
 		int stackSize = keepStackSize();
     }
 :
 (
-{ before(grammarAccess.getFunctionDefinitionAccess().getStatefulStatefulKeyword_0_0()); }
-(
-{ before(grammarAccess.getFunctionDefinitionAccess().getStatefulStatefulKeyword_0_0()); }
-
-	'stateful' 
-
-{ after(grammarAccess.getFunctionDefinitionAccess().getStatefulStatefulKeyword_0_0()); }
-)
-
-{ after(grammarAccess.getFunctionDefinitionAccess().getStatefulStatefulKeyword_0_0()); }
+{ before(grammarAccess.getFunctionDefinitionAccess().getKindFunctionKindEnumRuleCall_0_0()); }
+	ruleFunctionKind{ after(grammarAccess.getFunctionDefinitionAccess().getKindFunctionKindEnumRuleCall_0_0()); }
 )
 
 ;
@@ -18403,14 +18566,37 @@ finally {
 	restoreStackSize(stackSize);
 }
 
-rule__Equation__LeftHandSideAssignment_0
+rule__Equation__InitialAssignment_0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEquationAccess().getInitialInitialKeyword_0_0()); }
+(
+{ before(grammarAccess.getEquationAccess().getInitialInitialKeyword_0_0()); }
+
+	'initial' 
+
+{ after(grammarAccess.getEquationAccess().getInitialInitialKeyword_0_0()); }
+)
+
+{ after(grammarAccess.getEquationAccess().getInitialInitialKeyword_0_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Equation__LeftHandSideAssignment_1
     @init {
 		int stackSize = keepStackSize();
     }
 :
 (
-{ before(grammarAccess.getEquationAccess().getLeftHandSideExpressionParserRuleCall_0_0()); }
-	ruleExpression{ after(grammarAccess.getEquationAccess().getLeftHandSideExpressionParserRuleCall_0_0()); }
+{ before(grammarAccess.getEquationAccess().getLeftHandSideExpressionParserRuleCall_1_0()); }
+	ruleExpression{ after(grammarAccess.getEquationAccess().getLeftHandSideExpressionParserRuleCall_1_0()); }
 )
 
 ;
@@ -18418,14 +18604,14 @@ finally {
 	restoreStackSize(stackSize);
 }
 
-rule__Equation__RightHandSideAssignment_2
+rule__Equation__RightHandSideAssignment_3
     @init {
 		int stackSize = keepStackSize();
     }
 :
 (
-{ before(grammarAccess.getEquationAccess().getRightHandSideExpressionParserRuleCall_2_0()); }
-	ruleExpression{ after(grammarAccess.getEquationAccess().getRightHandSideExpressionParserRuleCall_2_0()); }
+{ before(grammarAccess.getEquationAccess().getRightHandSideExpressionParserRuleCall_3_0()); }
+	ruleExpression{ after(grammarAccess.getEquationAccess().getRightHandSideExpressionParserRuleCall_3_0()); }
 )
 
 ;
@@ -19799,6 +19985,25 @@ finally {
 	restoreStackSize(stackSize);
 }
 
+rule__DerivativeOperator__VariableAssignment_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getDerivativeOperatorAccess().getVariableCallableElementCrossReference_1_0()); }
+(
+{ before(grammarAccess.getDerivativeOperatorAccess().getVariableCallableElementValidIDParserRuleCall_1_0_1()); }
+	ruleValidID{ after(grammarAccess.getDerivativeOperatorAccess().getVariableCallableElementValidIDParserRuleCall_1_0_1()); }
+)
+{ after(grammarAccess.getDerivativeOperatorAccess().getVariableCallableElementCrossReference_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
 rule__ArrayConstructionOperator__ExpressionsAssignment_1
     @init {
 		int stackSize = keepStackSize();

+ 78 - 72
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.tokens

@@ -28,6 +28,7 @@ T__57=57
 T__58=58
 T__16=16
 T__51=51
+T__90=90
 T__15=15
 T__52=52
 T__18=18
@@ -59,6 +60,8 @@ RULE_SL_COMMENT=11
 T__84=84
 T__87=87
 T__86=86
+T__89=89
+T__88=88
 RULE_ML_COMMENT=10
 T__30=30
 T__31=31
@@ -82,77 +85,80 @@ T__73=73
 T__79=79
 T__78=78
 T__77=77
-'end'=77
-'>='=25
-'/'=29
-'=='=20
-'switch'=65
-'then'=63
-'string'=57
-'type'=39
-'>'=24
-'||'=69
-'&&'=70
-'complex'=54
-';'=41
-'return'=83
-'warning'=17
-'for'=75
-'+'=26
-'fob'=51
-'.'=72
-'=>'=68
-'is'=71
-'^'=32
-'error'=18
-'$'=76
-'static'=86
-'true'=87
-'else'=64
-'func'=44
-'let'=60
-'break'=82
-'fatal'=19
-'{'=36
-'stateful'=85
+'end'=80
+'>='=27
+'/'=31
+'=='=22
+'switch'=67
+'then'=65
+'string'=59
+'type'=41
+'>'=26
+'||'=71
+'&&'=72
+'complex'=56
+';'=43
+'return'=86
+'warning'=19
+'continuous'=17
+'for'=78
+'+'=28
+'fob'=53
+'.'=74
+'=>'=70
+'is'=73
+'^'=34
+'error'=20
+'$'=79
+'static'=88
+'true'=90
+'der'=77
+'else'=66
+'func'=46
+'let'=62
+'break'=85
+'fatal'=21
+'{'=38
+'stateful'=16
 '\''=14
-'check'=48
-'var'=50
-'int'=53
-'if'=62
-':'=43
-'('=45
-'while'=79
-'-'=27
-','=38
-'default'=66
-'in'=61
-']'=59
-'..'=74
-'enum'=35
-'real'=52
-'!'=34
-'|'=73
-'assert'=49
-'.^'=33
-'.*'=30
-'info'=16
-'='=40
-'::'=84
-')'=46
-'bool'=56
-'./'=31
-'->'=47
-'do'=80
-'case'=67
-'}'=37
-'<='=23
-'!='=21
-'continue'=81
+'check'=50
+'var'=52
+'int'=55
+'if'=64
+':'=45
+'('=47
+'while'=82
+'-'=29
+','=40
+'default'=68
+'in'=63
+']'=61
+'..'=76
+'enum'=37
+'real'=54
+'!'=36
+'|'=75
+'assert'=51
+'.^'=35
+'.*'=32
+'info'=18
+'='=42
+'::'=87
+')'=48
+'bool'=58
+'initial'=89
+'./'=33
+'->'=49
+'do'=83
+'case'=69
+'}'=39
+'<='=25
+'!='=23
+'continue'=84
 'false'=15
-'<'=22
-'algo'=78
-'*'=28
-'['=58
-'gauss'=55
-'record'=42
+'<'=24
+'algo'=81
+'*'=30
+'['=60
+'gauss'=57
+'record'=44

File diff suppressed because it is too large
+ 582 - 479
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscriptLexer.java


File diff suppressed because it is too large
+ 10161 - 9521
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscriptParser.java


+ 10 - 1
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/model/Mscript.ecore

@@ -33,7 +33,7 @@
         containment="true"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="FunctionDefinition" eSuperTypes="#//Definition #//CallableElement">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="stateful" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="kind" eType="#//FunctionKind"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="templateParameterDeclarations"
         upperBound="-1" eType="#//TemplateParameterDeclaration" containment="true"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="inputParameterDeclarations"
@@ -51,6 +51,11 @@
     <eStructuralFeatures xsi:type="ecore:EReference" name="equations" upperBound="-1"
         eType="#//Equation" containment="true"/>
   </eClassifiers>
+  <eClassifiers xsi:type="ecore:EEnum" name="FunctionKind">
+    <eLiterals name="Stateless"/>
+    <eLiterals name="Stateful" value="1"/>
+    <eLiterals name="Continuous" value="2"/>
+  </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="Check">
     <eStructuralFeatures xsi:type="ecore:EReference" name="function" lowerBound="1"
         eType="#//FunctionDefinition" eOpposite="#//FunctionDefinition/checks"/>
@@ -98,6 +103,7 @@
         containment="true"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="Equation">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="initial" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="leftHandSide" eType="ecore:EClass ../../org.eclipselabs.mscript.typesystem/model/TypeSystem.ecore#//Expression"
         containment="true"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="rightHandSide" eType="ecore:EClass ../../org.eclipselabs.mscript.typesystem/model/TypeSystem.ecore#//Expression"
@@ -211,6 +217,9 @@
     <eStructuralFeatures xsi:type="ecore:EReference" name="initializer" eType="ecore:EClass ../../org.eclipselabs.mscript.typesystem/model/TypeSystem.ecore#//Expression"
         containment="true"/>
   </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="DerivativeOperator" eSuperTypes="../../org.eclipselabs.mscript.typesystem/model/TypeSystem.ecore#//Expression">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="variable" eType="#//CallableElement"/>
+  </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="ArrayConstructionOperator" eSuperTypes="../../org.eclipselabs.mscript.typesystem/model/TypeSystem.ecore#//Expression">
     <eStructuralFeatures xsi:type="ecore:EReference" name="expressions" upperBound="-1"
         eType="ecore:EClass ../../org.eclipselabs.mscript.typesystem/model/TypeSystem.ecore#//Expression"

+ 10 - 1
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/model/Mscript.genmodel

@@ -11,6 +11,11 @@
   <foreignModel>Mscript.ecore</foreignModel>
   <genPackages prefix="Ast" basePackage="org.eclipselabs.mscript.language" disposableProviderFactory="true"
       ecorePackage="Mscript.ecore#/">
+    <genEnums typeSafeEnumCompatible="false" ecoreEnum="Mscript.ecore#//FunctionKind">
+      <genEnumLiterals ecoreEnumLiteral="Mscript.ecore#//FunctionKind/Stateless"/>
+      <genEnumLiterals ecoreEnumLiteral="Mscript.ecore#//FunctionKind/Stateful"/>
+      <genEnumLiterals ecoreEnumLiteral="Mscript.ecore#//FunctionKind/Continuous"/>
+    </genEnums>
     <genEnums typeSafeEnumCompatible="false" ecoreEnum="Mscript.ecore#//AssertionStatusKind">
       <genEnumLiterals ecoreEnumLiteral="Mscript.ecore#//AssertionStatusKind/Info"/>
       <genEnumLiterals ecoreEnumLiteral="Mscript.ecore#//AssertionStatusKind/Warning"/>
@@ -72,7 +77,7 @@
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Mscript.ecore#//RecordFieldDeclaration/type"/>
     </genClasses>
     <genClasses ecoreClass="Mscript.ecore#//FunctionDefinition">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Mscript.ecore#//FunctionDefinition/stateful"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Mscript.ecore#//FunctionDefinition/kind"/>
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Mscript.ecore#//FunctionDefinition/templateParameterDeclarations"/>
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Mscript.ecore#//FunctionDefinition/inputParameterDeclarations"/>
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Mscript.ecore#//FunctionDefinition/outputParameterDeclarations"/>
@@ -113,6 +118,7 @@
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Mscript.ecore#//FunctionObjectDeclaration/templateArguments"/>
     </genClasses>
     <genClasses ecoreClass="Mscript.ecore#//Equation">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Mscript.ecore#//Equation/initial"/>
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Mscript.ecore#//Equation/leftHandSide"/>
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Mscript.ecore#//Equation/rightHandSide"/>
     </genClasses>
@@ -170,6 +176,9 @@
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Mscript.ecore#//IterationAccumulator/name"/>
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Mscript.ecore#//IterationAccumulator/initializer"/>
     </genClasses>
+    <genClasses ecoreClass="Mscript.ecore#//DerivativeOperator">
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference Mscript.ecore#//DerivativeOperator/variable"/>
+    </genClasses>
     <genClasses ecoreClass="Mscript.ecore#//ArrayConstructionOperator">
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Mscript.ecore#//ArrayConstructionOperator/expressions"/>
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Mscript.ecore#//ArrayConstructionOperator/iterationClauses"/>

File diff suppressed because it is too large
+ 254 - 219
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src-gen/org/eclipselabs/mscript/language/Mscript.xmi


+ 285 - 86
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src-gen/org/eclipselabs/mscript/language/parseTreeConstruction/MscriptParsetreeConstructor.java

@@ -102,31 +102,32 @@ protected class ThisRootNode extends RootToken {
 			case 68: return new PrimitiveStepExpression_Alternatives(this, this, 68, inst);
 			case 69: return new StepLiteral_ValueAssignment(this, this, 69, inst);
 			case 70: return new StepN_Group(this, this, 70, inst);
-			case 71: return new ArrayConstructionOperator_Group(this, this, 71, inst);
-			case 72: return new ArrayConstructionIterationClause_Group(this, this, 72, inst);
-			case 73: return new ArrayConcatenationOperator_Group(this, this, 73, inst);
-			case 74: return new ExpressionList_Group(this, this, 74, inst);
-			case 75: return new UnitConstructionOperator_Group(this, this, 75, inst);
-			case 76: return new ParenthesizedExpression_Group(this, this, 76, inst);
-			case 77: return new EndExpression_Group(this, this, 77, inst);
-			case 78: return new AlgorithmExpression_Group(this, this, 78, inst);
-			case 79: return new Compound_Group(this, this, 79, inst);
-			case 80: return new Statement_Alternatives(this, this, 80, inst);
-			case 81: return new Assignment_Group(this, this, 81, inst);
-			case 82: return new VariableDeclaration_Group(this, this, 82, inst);
-			case 83: return new IfStatement_Group(this, this, 83, inst);
-			case 84: return new WhileStatement_Group(this, this, 84, inst);
-			case 85: return new ForStatement_Group(this, this, 85, inst);
-			case 86: return new DoWhileStatement_Group(this, this, 86, inst);
-			case 87: return new ContinueStatement_Group(this, this, 87, inst);
-			case 88: return new BreakStatement_Group(this, this, 88, inst);
-			case 89: return new ReturnStatement_Group(this, this, 89, inst);
-			case 90: return new Unit_Group(this, this, 90, inst);
-			case 91: return new ExplicitUnit_Group(this, this, 91, inst);
-			case 92: return new UnitNumerator_Alternatives(this, this, 92, inst);
-			case 93: return new ImplicitUnitNumerator_UnitNumeratorAction(this, this, 93, inst);
-			case 94: return new UnitDenominator_Alternatives(this, this, 94, inst);
-			case 95: return new UnitFactor_Group(this, this, 95, inst);
+			case 71: return new DerivativeOperator_Group(this, this, 71, inst);
+			case 72: return new ArrayConstructionOperator_Group(this, this, 72, inst);
+			case 73: return new ArrayConstructionIterationClause_Group(this, this, 73, inst);
+			case 74: return new ArrayConcatenationOperator_Group(this, this, 74, inst);
+			case 75: return new ExpressionList_Group(this, this, 75, inst);
+			case 76: return new UnitConstructionOperator_Group(this, this, 76, inst);
+			case 77: return new ParenthesizedExpression_Group(this, this, 77, inst);
+			case 78: return new EndExpression_Group(this, this, 78, inst);
+			case 79: return new AlgorithmExpression_Group(this, this, 79, inst);
+			case 80: return new Compound_Group(this, this, 80, inst);
+			case 81: return new Statement_Alternatives(this, this, 81, inst);
+			case 82: return new Assignment_Group(this, this, 82, inst);
+			case 83: return new VariableDeclaration_Group(this, this, 83, inst);
+			case 84: return new IfStatement_Group(this, this, 84, inst);
+			case 85: return new WhileStatement_Group(this, this, 85, inst);
+			case 86: return new ForStatement_Group(this, this, 86, inst);
+			case 87: return new DoWhileStatement_Group(this, this, 87, inst);
+			case 88: return new ContinueStatement_Group(this, this, 88, inst);
+			case 89: return new BreakStatement_Group(this, this, 89, inst);
+			case 90: return new ReturnStatement_Group(this, this, 90, inst);
+			case 91: return new Unit_Group(this, this, 91, inst);
+			case 92: return new ExplicitUnit_Group(this, this, 92, inst);
+			case 93: return new UnitNumerator_Alternatives(this, this, 93, inst);
+			case 94: return new ImplicitUnitNumerator_UnitNumeratorAction(this, this, 94, inst);
+			case 95: return new UnitDenominator_Alternatives(this, this, 95, inst);
+			case 96: return new UnitFactor_Group(this, this, 96, inst);
 			default: return null;
 		}	
 	}	
@@ -1356,7 +1357,7 @@ protected class RecordFieldDeclaration_SemicolonKeyword_3 extends KeywordToken
  * / *
  *  * Function
  *  * / FunctionDefinition:
- * 	stateful?="stateful"? "func" name=ValidID ("<" templateParameterDeclarations+=TemplateParameterDeclaration (","
+ * 	kind=FunctionKind? "func" name=ValidID ("<" templateParameterDeclarations+=TemplateParameterDeclaration (","
  * 	templateParameterDeclarations+=TemplateParameterDeclaration)* ">")? "("
  * 	(inputParameterDeclarations+=InputParameterDeclaration ("," inputParameterDeclarations+=InputParameterDeclaration)*)?
  * 	")" "->" outputParameterDeclarations+=OutputParameterDeclaration (","
@@ -1366,7 +1367,7 @@ protected class RecordFieldDeclaration_SemicolonKeyword_3 extends KeywordToken
  *
  **/
 
-// stateful?="stateful"? "func" name=ValidID ("<" templateParameterDeclarations+=TemplateParameterDeclaration (","
+// kind=FunctionKind? "func" name=ValidID ("<" templateParameterDeclarations+=TemplateParameterDeclaration (","
 // templateParameterDeclarations+=TemplateParameterDeclaration)* ">")? "("
 // (inputParameterDeclarations+=InputParameterDeclaration ("," inputParameterDeclarations+=InputParameterDeclaration)*)?
 // ")" "->" outputParameterDeclarations+=OutputParameterDeclaration (","
@@ -1401,16 +1402,16 @@ protected class FunctionDefinition_Group extends GroupToken {
 
 }
 
-// stateful?="stateful"?
-protected class FunctionDefinition_StatefulAssignment_0 extends AssignmentToken  {
+// kind=FunctionKind?
+protected class FunctionDefinition_KindAssignment_0 extends AssignmentToken  {
 	
-	public FunctionDefinition_StatefulAssignment_0(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
+	public FunctionDefinition_KindAssignment_0(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
 		super(lastRuleCallOrigin, next, transitionIndex, eObjectConsumer);
 	}
 	
 	@Override
 	public Assignment getGrammarElement() {
-		return grammarAccess.getFunctionDefinitionAccess().getStatefulAssignment_0();
+		return grammarAccess.getFunctionDefinitionAccess().getKindAssignment_0();
 	}
 
     @Override
@@ -1422,11 +1423,11 @@ protected class FunctionDefinition_StatefulAssignment_0 extends AssignmentToken
 
     @Override	
 	public IEObjectConsumer tryConsume() {
-		if((value = eObjectConsumer.getConsumable("stateful",false)) == null) return null;
-		IEObjectConsumer obj = eObjectConsumer.cloneAndConsume("stateful");
-		if(Boolean.TRUE.equals(value)) { // org::eclipse::xtext::impl::KeywordImpl
-			type = AssignmentType.KEYWORD;
-			element = grammarAccess.getFunctionDefinitionAccess().getStatefulStatefulKeyword_0_0();
+		if((value = eObjectConsumer.getConsumable("kind",false)) == null) return null;
+		IEObjectConsumer obj = eObjectConsumer.cloneAndConsume("kind");
+		if(enumLitSerializer.isValid(obj.getEObject(), grammarAccess.getFunctionDefinitionAccess().getKindFunctionKindEnumRuleCall_0_0(), value, null)) { 
+			type = AssignmentType.ENUM_RULE_CALL;
+			element = grammarAccess.getFunctionDefinitionAccess().getKindFunctionKindEnumRuleCall_0_0();
 			return obj;
 		}
 		return null;
@@ -1449,7 +1450,7 @@ protected class FunctionDefinition_FuncKeyword_1 extends KeywordToken  {
     @Override
 	public AbstractToken createFollower(int index, IEObjectConsumer inst) {
 		switch(index) {
-			case 0: return new FunctionDefinition_StatefulAssignment_0(lastRuleCallOrigin, this, 0, inst);
+			case 0: return new FunctionDefinition_KindAssignment_0(lastRuleCallOrigin, this, 0, inst);
 			default: return lastRuleCallOrigin.createFollowerAfterReturn(this, index, index - 1, inst);
 		}	
 	}
@@ -3945,11 +3946,11 @@ protected class FunctionObjectDeclaration_SemicolonKeyword_5 extends KeywordToke
 /************ begin Rule Equation ****************
  *
  * Equation:
- * 	leftHandSide=Expression "=" rightHandSide=Expression ";";
+ * 	initial?="initial"? leftHandSide=Expression "=" rightHandSide=Expression ";";
  *
  **/
 
-// leftHandSide=Expression "=" rightHandSide=Expression ";"
+// initial?="initial"? leftHandSide=Expression "=" rightHandSide=Expression ";"
 protected class Equation_Group extends GroupToken {
 	
 	public Equation_Group(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
@@ -3964,7 +3965,7 @@ protected class Equation_Group extends GroupToken {
     @Override
 	public AbstractToken createFollower(int index, IEObjectConsumer inst) {
 		switch(index) {
-			case 0: return new Equation_SemicolonKeyword_3(lastRuleCallOrigin, this, 0, inst);
+			case 0: return new Equation_SemicolonKeyword_4(lastRuleCallOrigin, this, 0, inst);
 			default: return null;
 		}	
 	}
@@ -3978,16 +3979,49 @@ protected class Equation_Group extends GroupToken {
 
 }
 
+// initial?="initial"?
+protected class Equation_InitialAssignment_0 extends AssignmentToken  {
+	
+	public Equation_InitialAssignment_0(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
+		super(lastRuleCallOrigin, next, transitionIndex, eObjectConsumer);
+	}
+	
+	@Override
+	public Assignment getGrammarElement() {
+		return grammarAccess.getEquationAccess().getInitialAssignment_0();
+	}
+
+    @Override
+	public AbstractToken createFollower(int index, IEObjectConsumer inst) {
+		switch(index) {
+			default: return lastRuleCallOrigin.createFollowerAfterReturn(this, index, index, inst);
+		}	
+	}
+
+    @Override	
+	public IEObjectConsumer tryConsume() {
+		if((value = eObjectConsumer.getConsumable("initial",false)) == null) return null;
+		IEObjectConsumer obj = eObjectConsumer.cloneAndConsume("initial");
+		if(Boolean.TRUE.equals(value)) { // org::eclipse::xtext::impl::KeywordImpl
+			type = AssignmentType.KEYWORD;
+			element = grammarAccess.getEquationAccess().getInitialInitialKeyword_0_0();
+			return obj;
+		}
+		return null;
+	}
+
+}
+
 // leftHandSide=Expression
-protected class Equation_LeftHandSideAssignment_0 extends AssignmentToken  {
+protected class Equation_LeftHandSideAssignment_1 extends AssignmentToken  {
 	
-	public Equation_LeftHandSideAssignment_0(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
+	public Equation_LeftHandSideAssignment_1(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
 		super(lastRuleCallOrigin, next, transitionIndex, eObjectConsumer);
 	}
 	
 	@Override
 	public Assignment getGrammarElement() {
-		return grammarAccess.getEquationAccess().getLeftHandSideAssignment_0();
+		return grammarAccess.getEquationAccess().getLeftHandSideAssignment_1();
 	}
 
     @Override
@@ -4006,7 +4040,7 @@ protected class Equation_LeftHandSideAssignment_0 extends AssignmentToken  {
 			IEObjectConsumer param = createEObjectConsumer((EObject)value);
 			if(param.isInstanceOf(grammarAccess.getExpressionRule().getType().getClassifier())) {
 				type = AssignmentType.PARSER_RULE_CALL;
-				element = grammarAccess.getEquationAccess().getLeftHandSideExpressionParserRuleCall_0_0(); 
+				element = grammarAccess.getEquationAccess().getLeftHandSideExpressionParserRuleCall_1_0(); 
 				consumed = obj;
 				return param;
 			}
@@ -4018,27 +4052,28 @@ protected class Equation_LeftHandSideAssignment_0 extends AssignmentToken  {
 	public AbstractToken createFollowerAfterReturn(AbstractToken next,	int actIndex, int index, IEObjectConsumer inst) {
 		if(value == inst.getEObject() && !inst.isConsumed()) return null;
 		switch(index) {
-			default: return lastRuleCallOrigin.createFollowerAfterReturn(next, actIndex , index, consumed);
+			case 0: return new Equation_InitialAssignment_0(lastRuleCallOrigin, next, actIndex, consumed);
+			default: return lastRuleCallOrigin.createFollowerAfterReturn(next, actIndex , index - 1, consumed);
 		}	
 	}	
 }
 
 // "="
-protected class Equation_EqualsSignKeyword_1 extends KeywordToken  {
+protected class Equation_EqualsSignKeyword_2 extends KeywordToken  {
 	
-	public Equation_EqualsSignKeyword_1(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
+	public Equation_EqualsSignKeyword_2(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
 		super(lastRuleCallOrigin, next, transitionIndex, eObjectConsumer);
 	}
 	
 	@Override
 	public Keyword getGrammarElement() {
-		return grammarAccess.getEquationAccess().getEqualsSignKeyword_1();
+		return grammarAccess.getEquationAccess().getEqualsSignKeyword_2();
 	}
 
     @Override
 	public AbstractToken createFollower(int index, IEObjectConsumer inst) {
 		switch(index) {
-			case 0: return new Equation_LeftHandSideAssignment_0(lastRuleCallOrigin, this, 0, inst);
+			case 0: return new Equation_LeftHandSideAssignment_1(lastRuleCallOrigin, this, 0, inst);
 			default: return null;
 		}	
 	}
@@ -4046,15 +4081,15 @@ protected class Equation_EqualsSignKeyword_1 extends KeywordToken  {
 }
 
 // rightHandSide=Expression
-protected class Equation_RightHandSideAssignment_2 extends AssignmentToken  {
+protected class Equation_RightHandSideAssignment_3 extends AssignmentToken  {
 	
-	public Equation_RightHandSideAssignment_2(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
+	public Equation_RightHandSideAssignment_3(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
 		super(lastRuleCallOrigin, next, transitionIndex, eObjectConsumer);
 	}
 	
 	@Override
 	public Assignment getGrammarElement() {
-		return grammarAccess.getEquationAccess().getRightHandSideAssignment_2();
+		return grammarAccess.getEquationAccess().getRightHandSideAssignment_3();
 	}
 
     @Override
@@ -4073,7 +4108,7 @@ protected class Equation_RightHandSideAssignment_2 extends AssignmentToken  {
 			IEObjectConsumer param = createEObjectConsumer((EObject)value);
 			if(param.isInstanceOf(grammarAccess.getExpressionRule().getType().getClassifier())) {
 				type = AssignmentType.PARSER_RULE_CALL;
-				element = grammarAccess.getEquationAccess().getRightHandSideExpressionParserRuleCall_2_0(); 
+				element = grammarAccess.getEquationAccess().getRightHandSideExpressionParserRuleCall_3_0(); 
 				consumed = obj;
 				return param;
 			}
@@ -4085,28 +4120,28 @@ protected class Equation_RightHandSideAssignment_2 extends AssignmentToken  {
 	public AbstractToken createFollowerAfterReturn(AbstractToken next,	int actIndex, int index, IEObjectConsumer inst) {
 		if(value == inst.getEObject() && !inst.isConsumed()) return null;
 		switch(index) {
-			case 0: return new Equation_EqualsSignKeyword_1(lastRuleCallOrigin, next, actIndex, consumed);
+			case 0: return new Equation_EqualsSignKeyword_2(lastRuleCallOrigin, next, actIndex, consumed);
 			default: return null;
 		}	
 	}	
 }
 
 // ";"
-protected class Equation_SemicolonKeyword_3 extends KeywordToken  {
+protected class Equation_SemicolonKeyword_4 extends KeywordToken  {
 	
-	public Equation_SemicolonKeyword_3(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
+	public Equation_SemicolonKeyword_4(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
 		super(lastRuleCallOrigin, next, transitionIndex, eObjectConsumer);
 	}
 	
 	@Override
 	public Keyword getGrammarElement() {
-		return grammarAccess.getEquationAccess().getSemicolonKeyword_3();
+		return grammarAccess.getEquationAccess().getSemicolonKeyword_4();
 	}
 
     @Override
 	public AbstractToken createFollower(int index, IEObjectConsumer inst) {
 		switch(index) {
-			case 0: return new Equation_RightHandSideAssignment_2(lastRuleCallOrigin, this, 0, inst);
+			case 0: return new Equation_RightHandSideAssignment_3(lastRuleCallOrigin, this, 0, inst);
 			default: return null;
 		}	
 	}
@@ -6154,6 +6189,7 @@ protected class Expression_Alternatives extends AlternativesToken {
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayElementAccessAccess().getArrayElementAccessArrayAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEqualityExpressionAccess().getEqualityExpressionLeftOperandAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
@@ -6320,6 +6356,7 @@ protected class Expression_RangeExpressionParserRuleCall_3 extends RuleCallToken
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayElementAccessAccess().getArrayElementAccessArrayAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEqualityExpressionAccess().getEqualityExpressionLeftOperandAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
@@ -7826,6 +7863,7 @@ protected class RangeExpression_Group extends GroupToken {
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayElementAccessAccess().getArrayElementAccessArrayAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEqualityExpressionAccess().getEqualityExpressionLeftOperandAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
@@ -7881,6 +7919,7 @@ protected class RangeExpression_ImpliesExpressionParserRuleCall_0 extends RuleCa
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayElementAccessAccess().getArrayElementAccessArrayAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEqualityExpressionAccess().getEqualityExpressionLeftOperandAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
@@ -8173,6 +8212,7 @@ protected class ImpliesExpression_Group extends GroupToken {
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayElementAccessAccess().getArrayElementAccessArrayAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEqualityExpressionAccess().getEqualityExpressionLeftOperandAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
@@ -8227,6 +8267,7 @@ protected class ImpliesExpression_LogicalOrExpressionParserRuleCall_0 extends Ru
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayElementAccessAccess().getArrayElementAccessArrayAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEqualityExpressionAccess().getEqualityExpressionLeftOperandAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
@@ -8426,6 +8467,7 @@ protected class LogicalOrExpression_Group extends GroupToken {
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayElementAccessAccess().getArrayElementAccessArrayAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEqualityExpressionAccess().getEqualityExpressionLeftOperandAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
@@ -8479,6 +8521,7 @@ protected class LogicalOrExpression_LogicalAndExpressionParserRuleCall_0 extends
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayElementAccessAccess().getArrayElementAccessArrayAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEqualityExpressionAccess().getEqualityExpressionLeftOperandAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
@@ -8678,6 +8721,7 @@ protected class LogicalAndExpression_Group extends GroupToken {
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayElementAccessAccess().getArrayElementAccessArrayAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEqualityExpressionAccess().getEqualityExpressionLeftOperandAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
@@ -8730,6 +8774,7 @@ protected class LogicalAndExpression_EqualityExpressionParserRuleCall_0 extends
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayElementAccessAccess().getArrayElementAccessArrayAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEqualityExpressionAccess().getEqualityExpressionLeftOperandAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
@@ -8930,6 +8975,7 @@ protected class EqualityExpression_Group extends GroupToken {
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayElementAccessAccess().getArrayElementAccessArrayAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEqualityExpressionAccess().getEqualityExpressionLeftOperandAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
@@ -8981,6 +9027,7 @@ protected class EqualityExpression_RelationalExpressionParserRuleCall_0 extends
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayElementAccessAccess().getArrayElementAccessArrayAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getIntegerLiteralRule().getType().getClassifier() && 
@@ -9192,6 +9239,7 @@ protected class RelationalExpression_Group extends GroupToken {
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayElementAccessAccess().getArrayElementAccessArrayAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getIntegerLiteralRule().getType().getClassifier() && 
@@ -9242,6 +9290,7 @@ protected class RelationalExpression_AdditiveExpressionParserRuleCall_0 extends
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayElementAccessAccess().getArrayElementAccessArrayAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getIntegerLiteralRule().getType().getClassifier() && 
@@ -9634,6 +9683,7 @@ protected class AdditiveExpression_Group extends GroupToken {
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayElementAccessAccess().getArrayElementAccessArrayAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getIntegerLiteralRule().getType().getClassifier() && 
@@ -9681,6 +9731,7 @@ protected class AdditiveExpression_MultiplicativeExpressionParserRuleCall_0 exte
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayElementAccessAccess().getArrayElementAccessArrayAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getIntegerLiteralRule().getType().getClassifier() && 
@@ -9889,6 +9940,7 @@ protected class MultiplicativeExpression_Group extends GroupToken {
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayElementAccessAccess().getArrayElementAccessArrayAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getIntegerLiteralRule().getType().getClassifier() && 
@@ -9936,6 +9988,7 @@ protected class MultiplicativeExpression_PowerExpressionParserRuleCall_0 extends
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayElementAccessAccess().getArrayElementAccessArrayAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getIntegerLiteralRule().getType().getClassifier() && 
@@ -10141,6 +10194,7 @@ protected class PowerExpression_Group extends GroupToken {
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayElementAccessAccess().getArrayElementAccessArrayAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getIntegerLiteralRule().getType().getClassifier() && 
@@ -10187,6 +10241,7 @@ protected class PowerExpression_UnaryExpressionParserRuleCall_0 extends RuleCall
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayElementAccessAccess().getArrayElementAccessArrayAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getIntegerLiteralRule().getType().getClassifier() && 
@@ -10390,6 +10445,7 @@ protected class UnaryExpression_Alternatives extends AlternativesToken {
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayElementAccessAccess().getArrayElementAccessArrayAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getIntegerLiteralRule().getType().getClassifier() && 
@@ -10435,6 +10491,7 @@ protected class UnaryExpression_PostfixExpressionParserRuleCall_0 extends RuleCa
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayElementAccessAccess().getArrayElementAccessArrayAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getIntegerLiteralRule().getType().getClassifier() && 
@@ -10634,6 +10691,7 @@ protected class PostfixExpression_Group extends GroupToken {
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayElementAccessAccess().getArrayElementAccessArrayAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getIntegerLiteralRule().getType().getClassifier() && 
@@ -10678,6 +10736,7 @@ protected class PostfixExpression_ArrayElementAccessParserRuleCall_0 extends Rul
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayElementAccessAccess().getArrayElementAccessArrayAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getIntegerLiteralRule().getType().getClassifier() && 
@@ -10835,6 +10894,7 @@ protected class ArrayElementAccess_Group extends GroupToken {
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayElementAccessAccess().getArrayElementAccessArrayAction_1_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getIntegerLiteralRule().getType().getClassifier() && 
@@ -10877,6 +10937,7 @@ protected class ArrayElementAccess_MemberFeatureCallParserRuleCall_0 extends Rul
 		   getEObject().eClass() != grammarAccess.getArrayConcatenationOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getIntegerLiteralRule().getType().getClassifier() && 
@@ -11189,6 +11250,7 @@ protected class MemberFeatureCall_Group extends GroupToken {
 		   getEObject().eClass() != grammarAccess.getArrayConcatenationOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getIntegerLiteralRule().getType().getClassifier() && 
@@ -11231,6 +11293,7 @@ protected class MemberFeatureCall_PrimaryExpressionParserRuleCall_0 extends Rule
 		   getEObject().eClass() != grammarAccess.getArrayConcatenationOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getIntegerLiteralRule().getType().getClassifier() && 
@@ -12805,13 +12868,13 @@ protected class ArraySubscript_ExpressionAssignment_1 extends AssignmentToken  {
 /************ begin Rule PrimaryExpression ****************
  *
  * PrimaryExpression returns Expression:
- * 	Literal | FeatureCall | UnitConstructionOperator | ArrayConstructionOperator | ArrayConcatenationOperator |
- * 	ParenthesizedExpression | EndExpression | AlgorithmExpression;
+ * 	Literal | FeatureCall | DerivativeOperator | UnitConstructionOperator | ArrayConstructionOperator |
+ * 	ArrayConcatenationOperator | ParenthesizedExpression | EndExpression | AlgorithmExpression;
  *
  **/
 
-// Literal | FeatureCall | UnitConstructionOperator | ArrayConstructionOperator | ArrayConcatenationOperator |
-// ParenthesizedExpression | EndExpression | AlgorithmExpression
+// Literal | FeatureCall | DerivativeOperator | UnitConstructionOperator | ArrayConstructionOperator |
+// ArrayConcatenationOperator | ParenthesizedExpression | EndExpression | AlgorithmExpression
 protected class PrimaryExpression_Alternatives extends AlternativesToken {
 
 	public PrimaryExpression_Alternatives(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
@@ -12828,12 +12891,13 @@ protected class PrimaryExpression_Alternatives extends AlternativesToken {
 		switch(index) {
 			case 0: return new PrimaryExpression_LiteralParserRuleCall_0(lastRuleCallOrigin, this, 0, inst);
 			case 1: return new PrimaryExpression_FeatureCallParserRuleCall_1(lastRuleCallOrigin, this, 1, inst);
-			case 2: return new PrimaryExpression_UnitConstructionOperatorParserRuleCall_2(lastRuleCallOrigin, this, 2, inst);
-			case 3: return new PrimaryExpression_ArrayConstructionOperatorParserRuleCall_3(lastRuleCallOrigin, this, 3, inst);
-			case 4: return new PrimaryExpression_ArrayConcatenationOperatorParserRuleCall_4(lastRuleCallOrigin, this, 4, inst);
-			case 5: return new PrimaryExpression_ParenthesizedExpressionParserRuleCall_5(lastRuleCallOrigin, this, 5, inst);
-			case 6: return new PrimaryExpression_EndExpressionParserRuleCall_6(lastRuleCallOrigin, this, 6, inst);
-			case 7: return new PrimaryExpression_AlgorithmExpressionParserRuleCall_7(lastRuleCallOrigin, this, 7, inst);
+			case 2: return new PrimaryExpression_DerivativeOperatorParserRuleCall_2(lastRuleCallOrigin, this, 2, inst);
+			case 3: return new PrimaryExpression_UnitConstructionOperatorParserRuleCall_3(lastRuleCallOrigin, this, 3, inst);
+			case 4: return new PrimaryExpression_ArrayConstructionOperatorParserRuleCall_4(lastRuleCallOrigin, this, 4, inst);
+			case 5: return new PrimaryExpression_ArrayConcatenationOperatorParserRuleCall_5(lastRuleCallOrigin, this, 5, inst);
+			case 6: return new PrimaryExpression_ParenthesizedExpressionParserRuleCall_6(lastRuleCallOrigin, this, 6, inst);
+			case 7: return new PrimaryExpression_EndExpressionParserRuleCall_7(lastRuleCallOrigin, this, 7, inst);
+			case 8: return new PrimaryExpression_AlgorithmExpressionParserRuleCall_8(lastRuleCallOrigin, this, 8, inst);
 			default: return null;
 		}	
 	}
@@ -12844,6 +12908,7 @@ protected class PrimaryExpression_Alternatives extends AlternativesToken {
 		   getEObject().eClass() != grammarAccess.getArrayConcatenationOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getArrayConstructionOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0().getType().getClassifier() && 
+		   getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getEndExpressionAccess().getEndExpressionAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getFunctionCallAccess().getFunctionCallAction_0().getType().getClassifier() && 
 		   getEObject().eClass() != grammarAccess.getIntegerLiteralRule().getType().getClassifier() && 
@@ -12934,16 +12999,52 @@ protected class PrimaryExpression_FeatureCallParserRuleCall_1 extends RuleCallTo
 	}	
 }
 
+// DerivativeOperator
+protected class PrimaryExpression_DerivativeOperatorParserRuleCall_2 extends RuleCallToken {
+	
+	public PrimaryExpression_DerivativeOperatorParserRuleCall_2(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
+		super(lastRuleCallOrigin, next, transitionIndex, eObjectConsumer);
+	}
+	
+	@Override
+	public RuleCall getGrammarElement() {
+		return grammarAccess.getPrimaryExpressionAccess().getDerivativeOperatorParserRuleCall_2();
+	}
+
+    @Override
+	public AbstractToken createFollower(int index, IEObjectConsumer inst) {
+		switch(index) {
+			case 0: return new DerivativeOperator_Group(this, this, 0, inst);
+			default: return null;
+		}	
+	}
+
+    @Override
+	public IEObjectConsumer tryConsume() {
+		if(getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier())
+			return null;
+		if(checkForRecursion(DerivativeOperator_Group.class, eObjectConsumer)) return null;
+		return eObjectConsumer;
+	}
+	
+    @Override
+	public AbstractToken createFollowerAfterReturn(AbstractToken next,	int actIndex, int index, IEObjectConsumer inst) {
+		switch(index) {
+			default: return lastRuleCallOrigin.createFollowerAfterReturn(next, actIndex , index, inst);
+		}	
+	}	
+}
+
 // UnitConstructionOperator
-protected class PrimaryExpression_UnitConstructionOperatorParserRuleCall_2 extends RuleCallToken {
+protected class PrimaryExpression_UnitConstructionOperatorParserRuleCall_3 extends RuleCallToken {
 	
-	public PrimaryExpression_UnitConstructionOperatorParserRuleCall_2(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
+	public PrimaryExpression_UnitConstructionOperatorParserRuleCall_3(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
 		super(lastRuleCallOrigin, next, transitionIndex, eObjectConsumer);
 	}
 	
 	@Override
 	public RuleCall getGrammarElement() {
-		return grammarAccess.getPrimaryExpressionAccess().getUnitConstructionOperatorParserRuleCall_2();
+		return grammarAccess.getPrimaryExpressionAccess().getUnitConstructionOperatorParserRuleCall_3();
 	}
 
     @Override
@@ -12971,15 +13072,15 @@ protected class PrimaryExpression_UnitConstructionOperatorParserRuleCall_2 exten
 }
 
 // ArrayConstructionOperator
-protected class PrimaryExpression_ArrayConstructionOperatorParserRuleCall_3 extends RuleCallToken {
+protected class PrimaryExpression_ArrayConstructionOperatorParserRuleCall_4 extends RuleCallToken {
 	
-	public PrimaryExpression_ArrayConstructionOperatorParserRuleCall_3(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
+	public PrimaryExpression_ArrayConstructionOperatorParserRuleCall_4(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
 		super(lastRuleCallOrigin, next, transitionIndex, eObjectConsumer);
 	}
 	
 	@Override
 	public RuleCall getGrammarElement() {
-		return grammarAccess.getPrimaryExpressionAccess().getArrayConstructionOperatorParserRuleCall_3();
+		return grammarAccess.getPrimaryExpressionAccess().getArrayConstructionOperatorParserRuleCall_4();
 	}
 
     @Override
@@ -13007,15 +13108,15 @@ protected class PrimaryExpression_ArrayConstructionOperatorParserRuleCall_3 exte
 }
 
 // ArrayConcatenationOperator
-protected class PrimaryExpression_ArrayConcatenationOperatorParserRuleCall_4 extends RuleCallToken {
+protected class PrimaryExpression_ArrayConcatenationOperatorParserRuleCall_5 extends RuleCallToken {
 	
-	public PrimaryExpression_ArrayConcatenationOperatorParserRuleCall_4(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
+	public PrimaryExpression_ArrayConcatenationOperatorParserRuleCall_5(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
 		super(lastRuleCallOrigin, next, transitionIndex, eObjectConsumer);
 	}
 	
 	@Override
 	public RuleCall getGrammarElement() {
-		return grammarAccess.getPrimaryExpressionAccess().getArrayConcatenationOperatorParserRuleCall_4();
+		return grammarAccess.getPrimaryExpressionAccess().getArrayConcatenationOperatorParserRuleCall_5();
 	}
 
     @Override
@@ -13043,15 +13144,15 @@ protected class PrimaryExpression_ArrayConcatenationOperatorParserRuleCall_4 ext
 }
 
 // ParenthesizedExpression
-protected class PrimaryExpression_ParenthesizedExpressionParserRuleCall_5 extends RuleCallToken {
+protected class PrimaryExpression_ParenthesizedExpressionParserRuleCall_6 extends RuleCallToken {
 	
-	public PrimaryExpression_ParenthesizedExpressionParserRuleCall_5(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
+	public PrimaryExpression_ParenthesizedExpressionParserRuleCall_6(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
 		super(lastRuleCallOrigin, next, transitionIndex, eObjectConsumer);
 	}
 	
 	@Override
 	public RuleCall getGrammarElement() {
-		return grammarAccess.getPrimaryExpressionAccess().getParenthesizedExpressionParserRuleCall_5();
+		return grammarAccess.getPrimaryExpressionAccess().getParenthesizedExpressionParserRuleCall_6();
 	}
 
     @Override
@@ -13079,15 +13180,15 @@ protected class PrimaryExpression_ParenthesizedExpressionParserRuleCall_5 extend
 }
 
 // EndExpression
-protected class PrimaryExpression_EndExpressionParserRuleCall_6 extends RuleCallToken {
+protected class PrimaryExpression_EndExpressionParserRuleCall_7 extends RuleCallToken {
 	
-	public PrimaryExpression_EndExpressionParserRuleCall_6(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
+	public PrimaryExpression_EndExpressionParserRuleCall_7(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
 		super(lastRuleCallOrigin, next, transitionIndex, eObjectConsumer);
 	}
 	
 	@Override
 	public RuleCall getGrammarElement() {
-		return grammarAccess.getPrimaryExpressionAccess().getEndExpressionParserRuleCall_6();
+		return grammarAccess.getPrimaryExpressionAccess().getEndExpressionParserRuleCall_7();
 	}
 
     @Override
@@ -13115,15 +13216,15 @@ protected class PrimaryExpression_EndExpressionParserRuleCall_6 extends RuleCall
 }
 
 // AlgorithmExpression
-protected class PrimaryExpression_AlgorithmExpressionParserRuleCall_7 extends RuleCallToken {
+protected class PrimaryExpression_AlgorithmExpressionParserRuleCall_8 extends RuleCallToken {
 	
-	public PrimaryExpression_AlgorithmExpressionParserRuleCall_7(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
+	public PrimaryExpression_AlgorithmExpressionParserRuleCall_8(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
 		super(lastRuleCallOrigin, next, transitionIndex, eObjectConsumer);
 	}
 	
 	@Override
 	public RuleCall getGrammarElement() {
-		return grammarAccess.getPrimaryExpressionAccess().getAlgorithmExpressionParserRuleCall_7();
+		return grammarAccess.getPrimaryExpressionAccess().getAlgorithmExpressionParserRuleCall_8();
 	}
 
     @Override
@@ -15614,6 +15715,104 @@ protected class StepN_NTerminalRuleCall_1 extends UnassignedTextToken {
 /************ end Rule StepN ****************/
 
 
+/************ begin Rule DerivativeOperator ****************
+ *
+ * DerivativeOperator:
+ * 	"der" variable=[CallableElement|ValidID];
+ *
+ **/
+
+// "der" variable=[CallableElement|ValidID]
+protected class DerivativeOperator_Group extends GroupToken {
+	
+	public DerivativeOperator_Group(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
+		super(lastRuleCallOrigin, next, transitionIndex, eObjectConsumer);
+	}
+	
+	@Override
+	public Group getGrammarElement() {
+		return grammarAccess.getDerivativeOperatorAccess().getGroup();
+	}
+
+    @Override
+	public AbstractToken createFollower(int index, IEObjectConsumer inst) {
+		switch(index) {
+			case 0: return new DerivativeOperator_VariableAssignment_1(lastRuleCallOrigin, this, 0, inst);
+			default: return null;
+		}	
+	}
+
+    @Override
+	public IEObjectConsumer tryConsume() {
+		if(getEObject().eClass() != grammarAccess.getDerivativeOperatorRule().getType().getClassifier())
+			return null;
+		return eObjectConsumer;
+	}
+
+}
+
+// "der"
+protected class DerivativeOperator_DerKeyword_0 extends KeywordToken  {
+	
+	public DerivativeOperator_DerKeyword_0(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
+		super(lastRuleCallOrigin, next, transitionIndex, eObjectConsumer);
+	}
+	
+	@Override
+	public Keyword getGrammarElement() {
+		return grammarAccess.getDerivativeOperatorAccess().getDerKeyword_0();
+	}
+
+    @Override
+	public AbstractToken createFollower(int index, IEObjectConsumer inst) {
+		switch(index) {
+			default: return lastRuleCallOrigin.createFollowerAfterReturn(this, index, index, inst);
+		}	
+	}
+
+}
+
+// variable=[CallableElement|ValidID]
+protected class DerivativeOperator_VariableAssignment_1 extends AssignmentToken  {
+	
+	public DerivativeOperator_VariableAssignment_1(AbstractToken lastRuleCallOrigin, AbstractToken next, int transitionIndex, IEObjectConsumer eObjectConsumer) {
+		super(lastRuleCallOrigin, next, transitionIndex, eObjectConsumer);
+	}
+	
+	@Override
+	public Assignment getGrammarElement() {
+		return grammarAccess.getDerivativeOperatorAccess().getVariableAssignment_1();
+	}
+
+    @Override
+	public AbstractToken createFollower(int index, IEObjectConsumer inst) {
+		switch(index) {
+			case 0: return new DerivativeOperator_DerKeyword_0(lastRuleCallOrigin, this, 0, inst);
+			default: return null;
+		}	
+	}
+
+    @Override	
+	public IEObjectConsumer tryConsume() {
+		if((value = eObjectConsumer.getConsumable("variable",true)) == null) return null;
+		IEObjectConsumer obj = eObjectConsumer.cloneAndConsume("variable");
+		if(value instanceof EObject) { // org::eclipse::xtext::impl::CrossReferenceImpl
+			IEObjectConsumer param = createEObjectConsumer((EObject)value);
+			if(param.isInstanceOf(grammarAccess.getDerivativeOperatorAccess().getVariableCallableElementCrossReference_1_0().getType().getClassifier())) {
+				type = AssignmentType.CROSS_REFERENCE;
+				element = grammarAccess.getDerivativeOperatorAccess().getVariableCallableElementCrossReference_1_0(); 
+				return obj;
+			}
+		}
+		return null;
+	}
+
+}
+
+
+/************ end Rule DerivativeOperator ****************/
+
+
 /************ begin Rule ArrayConstructionOperator ****************
  *
  * ArrayConstructionOperator:

+ 123 - 36
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src-gen/org/eclipselabs/mscript/language/parser/antlr/internal/InternalMscript.g

@@ -542,16 +542,19 @@ ruleFunctionDefinition returns [EObject current=null]
     @after { leaveRule(); }:
 ((
 (
-		lv_stateful_0_0=	'stateful' 
-    {
-        newLeafNode(lv_stateful_0_0, grammarAccess.getFunctionDefinitionAccess().getStatefulStatefulKeyword_0_0());
-    }
- 
-	    {
+		{ 
+	        newCompositeNode(grammarAccess.getFunctionDefinitionAccess().getKindFunctionKindEnumRuleCall_0_0()); 
+	    }
+		lv_kind_0_0=ruleFunctionKind		{
 	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getFunctionDefinitionRule());
+	            $current = createModelElementForParent(grammarAccess.getFunctionDefinitionRule());
 	        }
-       		setWithLastConsumed($current, "stateful", true, "stateful");
+       		set(
+       			$current, 
+       			"kind",
+        		lv_kind_0_0, 
+        		"FunctionKind");
+	        afterParserOrEnumRuleCall();
 	    }
 
 )
@@ -1390,48 +1393,63 @@ ruleEquation returns [EObject current=null]
     }
     @after { leaveRule(); }:
 ((
+(
+		lv_initial_0_0=	'initial' 
+    {
+        newLeafNode(lv_initial_0_0, grammarAccess.getEquationAccess().getInitialInitialKeyword_0_0());
+    }
+ 
+	    {
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getEquationRule());
+	        }
+       		setWithLastConsumed($current, "initial", true, "initial");
+	    }
+
+)
+)?(
 (
 		{ 
-	        newCompositeNode(grammarAccess.getEquationAccess().getLeftHandSideExpressionParserRuleCall_0_0()); 
+	        newCompositeNode(grammarAccess.getEquationAccess().getLeftHandSideExpressionParserRuleCall_1_0()); 
 	    }
-		lv_leftHandSide_0_0=ruleExpression		{
+		lv_leftHandSide_1_0=ruleExpression		{
 	        if ($current==null) {
 	            $current = createModelElementForParent(grammarAccess.getEquationRule());
 	        }
        		set(
        			$current, 
        			"leftHandSide",
-        		lv_leftHandSide_0_0, 
+        		lv_leftHandSide_1_0, 
         		"Expression");
 	        afterParserOrEnumRuleCall();
 	    }
 
 )
-)	otherlv_1='=' 
+)	otherlv_2='=' 
     {
-    	newLeafNode(otherlv_1, grammarAccess.getEquationAccess().getEqualsSignKeyword_1());
+    	newLeafNode(otherlv_2, grammarAccess.getEquationAccess().getEqualsSignKeyword_2());
     }
 (
 (
 		{ 
-	        newCompositeNode(grammarAccess.getEquationAccess().getRightHandSideExpressionParserRuleCall_2_0()); 
+	        newCompositeNode(grammarAccess.getEquationAccess().getRightHandSideExpressionParserRuleCall_3_0()); 
 	    }
-		lv_rightHandSide_2_0=ruleExpression		{
+		lv_rightHandSide_3_0=ruleExpression		{
 	        if ($current==null) {
 	            $current = createModelElementForParent(grammarAccess.getEquationRule());
 	        }
        		set(
        			$current, 
        			"rightHandSide",
-        		lv_rightHandSide_2_0, 
+        		lv_rightHandSide_3_0, 
         		"Expression");
 	        afterParserOrEnumRuleCall();
 	    }
 
 )
-)	otherlv_3=';' 
+)	otherlv_4=';' 
     {
-    	newLeafNode(otherlv_3, grammarAccess.getEquationAccess().getSemicolonKeyword_3());
+    	newLeafNode(otherlv_4, grammarAccess.getEquationAccess().getSemicolonKeyword_4());
     }
 )
 ;
@@ -4085,61 +4103,71 @@ rulePrimaryExpression returns [EObject current=null]
 
     |
     { 
-        newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getUnitConstructionOperatorParserRuleCall_2()); 
+        newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getDerivativeOperatorParserRuleCall_2()); 
+    }
+    this_DerivativeOperator_2=ruleDerivativeOperator
+    { 
+        $current = $this_DerivativeOperator_2.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getUnitConstructionOperatorParserRuleCall_3()); 
     }
-    this_UnitConstructionOperator_2=ruleUnitConstructionOperator
+    this_UnitConstructionOperator_3=ruleUnitConstructionOperator
     { 
-        $current = $this_UnitConstructionOperator_2.current; 
+        $current = $this_UnitConstructionOperator_3.current; 
         afterParserOrEnumRuleCall();
     }
 
     |
     { 
-        newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArrayConstructionOperatorParserRuleCall_3()); 
+        newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArrayConstructionOperatorParserRuleCall_4()); 
     }
-    this_ArrayConstructionOperator_3=ruleArrayConstructionOperator
+    this_ArrayConstructionOperator_4=ruleArrayConstructionOperator
     { 
-        $current = $this_ArrayConstructionOperator_3.current; 
+        $current = $this_ArrayConstructionOperator_4.current; 
         afterParserOrEnumRuleCall();
     }
 
     |
     { 
-        newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArrayConcatenationOperatorParserRuleCall_4()); 
+        newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArrayConcatenationOperatorParserRuleCall_5()); 
     }
-    this_ArrayConcatenationOperator_4=ruleArrayConcatenationOperator
+    this_ArrayConcatenationOperator_5=ruleArrayConcatenationOperator
     { 
-        $current = $this_ArrayConcatenationOperator_4.current; 
+        $current = $this_ArrayConcatenationOperator_5.current; 
         afterParserOrEnumRuleCall();
     }
 
     |
     { 
-        newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getParenthesizedExpressionParserRuleCall_5()); 
+        newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getParenthesizedExpressionParserRuleCall_6()); 
     }
-    this_ParenthesizedExpression_5=ruleParenthesizedExpression
+    this_ParenthesizedExpression_6=ruleParenthesizedExpression
     { 
-        $current = $this_ParenthesizedExpression_5.current; 
+        $current = $this_ParenthesizedExpression_6.current; 
         afterParserOrEnumRuleCall();
     }
 
     |
     { 
-        newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getEndExpressionParserRuleCall_6()); 
+        newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getEndExpressionParserRuleCall_7()); 
     }
-    this_EndExpression_6=ruleEndExpression
+    this_EndExpression_7=ruleEndExpression
     { 
-        $current = $this_EndExpression_6.current; 
+        $current = $this_EndExpression_7.current; 
         afterParserOrEnumRuleCall();
     }
 
     |
     { 
-        newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getAlgorithmExpressionParserRuleCall_7()); 
+        newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getAlgorithmExpressionParserRuleCall_8()); 
     }
-    this_AlgorithmExpression_7=ruleAlgorithmExpression
+    this_AlgorithmExpression_8=ruleAlgorithmExpression
     { 
-        $current = $this_AlgorithmExpression_7.current; 
+        $current = $this_AlgorithmExpression_8.current; 
         afterParserOrEnumRuleCall();
     }
 )
@@ -5042,6 +5070,46 @@ ruleStepN returns [EObject current=null]
 
 
 
+// Entry rule entryRuleDerivativeOperator
+entryRuleDerivativeOperator returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getDerivativeOperatorRule()); }
+	 iv_ruleDerivativeOperator=ruleDerivativeOperator 
+	 { $current=$iv_ruleDerivativeOperator.current; } 
+	 EOF 
+;
+
+// Rule DerivativeOperator
+ruleDerivativeOperator returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='der' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getDerivativeOperatorAccess().getDerKeyword_0());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getDerivativeOperatorRule());
+	        }
+        }
+		{ 
+	        newCompositeNode(grammarAccess.getDerivativeOperatorAccess().getVariableCallableElementCrossReference_1_0()); 
+	    }
+		ruleValidID		{ 
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))
+;
+
+
+
+
+
 // Entry rule entryRuleArrayConstructionOperator
 entryRuleArrayConstructionOperator returns [EObject current=null] 
 	:
@@ -6931,6 +6999,25 @@ ruleValidID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()
 
 
 
+// Rule FunctionKind
+ruleFunctionKind returns [Enumerator current=null] 
+    @init { enterRule(); }
+    @after { leaveRule(); }:
+((	enumLiteral_0='stateful' 
+	{
+        $current = grammarAccess.getFunctionKindAccess().getStatefulEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+        newLeafNode(enumLiteral_0, grammarAccess.getFunctionKindAccess().getStatefulEnumLiteralDeclaration_0()); 
+    }
+)
+    |(	enumLiteral_1='continuous' 
+	{
+        $current = grammarAccess.getFunctionKindAccess().getContinuousEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+        newLeafNode(enumLiteral_1, grammarAccess.getFunctionKindAccess().getContinuousEnumLiteralDeclaration_1()); 
+    }
+));
+
+
+
 // Rule AssertionStatusKind
 ruleAssertionStatusKind returns [Enumerator current=null] 
     @init { enterRule(); }

+ 45 - 39
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src-gen/org/eclipselabs/mscript/language/parser/antlr/internal/InternalMscript.tokens

@@ -28,6 +28,7 @@ T__57=57
 T__58=58
 T__16=16
 T__51=51
+T__90=90
 T__15=15
 T__52=52
 T__18=18
@@ -59,6 +60,8 @@ RULE_SL_COMMENT=11
 T__84=84
 T__87=87
 T__86=86
+T__89=89
+T__88=88
 RULE_ML_COMMENT=10
 T__30=30
 T__31=31
@@ -82,47 +85,49 @@ T__73=73
 T__79=79
 T__78=78
 T__77=77
-'end'=63
-'>='=81
-'=='=78
-'/'=70
+'end'=64
+'>='=84
+'=='=81
+'/'=71
 'string'=40
 'then'=46
 'switch'=48
 'type'=18
-'>'=26
+'>'=25
 '||'=52
 'complex'=37
 '&&'=53
 ';'=20
-'warning'=75
-'return'=69
-'for'=61
-'+'=82
-'fob'=34
+'warning'=78
+'return'=70
+'continuous'=76
+'for'=62
+'+'=85
+'fob'=33
 '=>'=51
 '.'=55
-'^'=72
+'^'=73
 'is'=54
-'error'=76
-'$'=62
-'static'=31
+'error'=79
+'$'=63
+'static'=30
 'true'=57
 'else'=47
-'func'=24
+'der'=61
+'func'=23
 'let'=43
-'break'=68
-'fatal'=77
+'break'=69
+'fatal'=80
 '{'=15
-'stateful'=23
-'\''=87
-'check'=30
-'var'=33
+'stateful'=75
+'\''=90
+'check'=29
+'var'=32
 'int'=36
 'if'=45
-'('=27
 ':'=22
-'while'=65
+'('=26
+'while'=66
 '-'=60
 ','=16
 'in'=44
@@ -131,28 +136,29 @@ T__77=77
 'real'=35
 'enum'=14
 '..'=59
-'!'=86
-'assert'=32
+'!'=89
+'assert'=31
 '|'=56
-'.^'=85
-'.*'=83
-'info'=74
+'.^'=88
+'.*'=86
+'info'=77
 '='=19
-'::'=73
-')'=28
+'::'=74
+')'=27
 'bool'=39
-'./'=84
-'->'=29
-'do'=66
+'initial'=34
+'./'=87
+'->'=28
+'do'=67
 'case'=50
 '}'=17
-'<='=80
-'!='=79
-'continue'=67
+'<='=83
+'!='=82
+'continue'=68
 'false'=58
-'<'=25
-'algo'=64
-'*'=71
+'<'=24
+'algo'=65
+'*'=72
 '['=41
 'gauss'=38
 'record'=21

File diff suppressed because it is too large
+ 437 - 333
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src-gen/org/eclipselabs/mscript/language/parser/antlr/internal/InternalMscriptLexer.java


File diff suppressed because it is too large
+ 4318 - 4018
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src-gen/org/eclipselabs/mscript/language/parser/antlr/internal/InternalMscriptParser.java


+ 132 - 42
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src-gen/org/eclipselabs/mscript/language/services/MscriptGrammarAccess.java

@@ -281,8 +281,8 @@ public class MscriptGrammarAccess extends AbstractGrammarElementFinder {
 	public class FunctionDefinitionElements extends AbstractParserRuleElementFinder {
 		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "FunctionDefinition");
 		private final Group cGroup = (Group)rule.eContents().get(1);
-		private final Assignment cStatefulAssignment_0 = (Assignment)cGroup.eContents().get(0);
-		private final Keyword cStatefulStatefulKeyword_0_0 = (Keyword)cStatefulAssignment_0.eContents().get(0);
+		private final Assignment cKindAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cKindFunctionKindEnumRuleCall_0_0 = (RuleCall)cKindAssignment_0.eContents().get(0);
 		private final Keyword cFuncKeyword_1 = (Keyword)cGroup.eContents().get(1);
 		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
 		private final RuleCall cNameValidIDParserRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
@@ -328,7 +328,7 @@ public class MscriptGrammarAccess extends AbstractGrammarElementFinder {
 		/// *
 		// * Function
 		// * / FunctionDefinition:
-		//	stateful?="stateful"? "func" name=ValidID ("<" templateParameterDeclarations+=TemplateParameterDeclaration (","
+		//	kind=FunctionKind? "func" name=ValidID ("<" templateParameterDeclarations+=TemplateParameterDeclaration (","
 		//	templateParameterDeclarations+=TemplateParameterDeclaration)* ">")? "("
 		//	(inputParameterDeclarations+=InputParameterDeclaration ("," inputParameterDeclarations+=InputParameterDeclaration)*)?
 		//	")" "->" outputParameterDeclarations+=OutputParameterDeclaration (","
@@ -337,7 +337,7 @@ public class MscriptGrammarAccess extends AbstractGrammarElementFinder {
 		//	equations+=Equation)* "}";
 		public ParserRule getRule() { return rule; }
 
-		//stateful?="stateful"? "func" name=ValidID ("<" templateParameterDeclarations+=TemplateParameterDeclaration (","
+		//kind=FunctionKind? "func" name=ValidID ("<" templateParameterDeclarations+=TemplateParameterDeclaration (","
 		//templateParameterDeclarations+=TemplateParameterDeclaration)* ">")? "("
 		//(inputParameterDeclarations+=InputParameterDeclaration ("," inputParameterDeclarations+=InputParameterDeclaration)*)?
 		//")" "->" outputParameterDeclarations+=OutputParameterDeclaration (","
@@ -346,11 +346,11 @@ public class MscriptGrammarAccess extends AbstractGrammarElementFinder {
 		//equations+=Equation)* "}"
 		public Group getGroup() { return cGroup; }
 
-		//stateful?="stateful"?
-		public Assignment getStatefulAssignment_0() { return cStatefulAssignment_0; }
+		//kind=FunctionKind?
+		public Assignment getKindAssignment_0() { return cKindAssignment_0; }
 
-		//"stateful"
-		public Keyword getStatefulStatefulKeyword_0_0() { return cStatefulStatefulKeyword_0_0; }
+		//FunctionKind
+		public RuleCall getKindFunctionKindEnumRuleCall_0_0() { return cKindFunctionKindEnumRuleCall_0_0; }
 
 		//"func"
 		public Keyword getFuncKeyword_1() { return cFuncKeyword_1; }
@@ -819,37 +819,45 @@ public class MscriptGrammarAccess extends AbstractGrammarElementFinder {
 	public class EquationElements extends AbstractParserRuleElementFinder {
 		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "Equation");
 		private final Group cGroup = (Group)rule.eContents().get(1);
-		private final Assignment cLeftHandSideAssignment_0 = (Assignment)cGroup.eContents().get(0);
-		private final RuleCall cLeftHandSideExpressionParserRuleCall_0_0 = (RuleCall)cLeftHandSideAssignment_0.eContents().get(0);
-		private final Keyword cEqualsSignKeyword_1 = (Keyword)cGroup.eContents().get(1);
-		private final Assignment cRightHandSideAssignment_2 = (Assignment)cGroup.eContents().get(2);
-		private final RuleCall cRightHandSideExpressionParserRuleCall_2_0 = (RuleCall)cRightHandSideAssignment_2.eContents().get(0);
-		private final Keyword cSemicolonKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cInitialAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final Keyword cInitialInitialKeyword_0_0 = (Keyword)cInitialAssignment_0.eContents().get(0);
+		private final Assignment cLeftHandSideAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cLeftHandSideExpressionParserRuleCall_1_0 = (RuleCall)cLeftHandSideAssignment_1.eContents().get(0);
+		private final Keyword cEqualsSignKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cRightHandSideAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cRightHandSideExpressionParserRuleCall_3_0 = (RuleCall)cRightHandSideAssignment_3.eContents().get(0);
+		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
 		
 		//Equation:
-		//	leftHandSide=Expression "=" rightHandSide=Expression ";";
+		//	initial?="initial"? leftHandSide=Expression "=" rightHandSide=Expression ";";
 		public ParserRule getRule() { return rule; }
 
-		//leftHandSide=Expression "=" rightHandSide=Expression ";"
+		//initial?="initial"? leftHandSide=Expression "=" rightHandSide=Expression ";"
 		public Group getGroup() { return cGroup; }
 
+		//initial?="initial"?
+		public Assignment getInitialAssignment_0() { return cInitialAssignment_0; }
+
+		//"initial"
+		public Keyword getInitialInitialKeyword_0_0() { return cInitialInitialKeyword_0_0; }
+
 		//leftHandSide=Expression
-		public Assignment getLeftHandSideAssignment_0() { return cLeftHandSideAssignment_0; }
+		public Assignment getLeftHandSideAssignment_1() { return cLeftHandSideAssignment_1; }
 
 		//Expression
-		public RuleCall getLeftHandSideExpressionParserRuleCall_0_0() { return cLeftHandSideExpressionParserRuleCall_0_0; }
+		public RuleCall getLeftHandSideExpressionParserRuleCall_1_0() { return cLeftHandSideExpressionParserRuleCall_1_0; }
 
 		//"="
-		public Keyword getEqualsSignKeyword_1() { return cEqualsSignKeyword_1; }
+		public Keyword getEqualsSignKeyword_2() { return cEqualsSignKeyword_2; }
 
 		//rightHandSide=Expression
-		public Assignment getRightHandSideAssignment_2() { return cRightHandSideAssignment_2; }
+		public Assignment getRightHandSideAssignment_3() { return cRightHandSideAssignment_3; }
 
 		//Expression
-		public RuleCall getRightHandSideExpressionParserRuleCall_2_0() { return cRightHandSideExpressionParserRuleCall_2_0; }
+		public RuleCall getRightHandSideExpressionParserRuleCall_3_0() { return cRightHandSideExpressionParserRuleCall_3_0; }
 
 		//";"
-		public Keyword getSemicolonKeyword_3() { return cSemicolonKeyword_3; }
+		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
 	}
 
 	public class DataTypeSpecifierElements extends AbstractParserRuleElementFinder {
@@ -2446,20 +2454,21 @@ public class MscriptGrammarAccess extends AbstractGrammarElementFinder {
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final RuleCall cLiteralParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
 		private final RuleCall cFeatureCallParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
-		private final RuleCall cUnitConstructionOperatorParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
-		private final RuleCall cArrayConstructionOperatorParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
-		private final RuleCall cArrayConcatenationOperatorParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
-		private final RuleCall cParenthesizedExpressionParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
-		private final RuleCall cEndExpressionParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
-		private final RuleCall cAlgorithmExpressionParserRuleCall_7 = (RuleCall)cAlternatives.eContents().get(7);
+		private final RuleCall cDerivativeOperatorParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		private final RuleCall cUnitConstructionOperatorParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
+		private final RuleCall cArrayConstructionOperatorParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
+		private final RuleCall cArrayConcatenationOperatorParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
+		private final RuleCall cParenthesizedExpressionParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
+		private final RuleCall cEndExpressionParserRuleCall_7 = (RuleCall)cAlternatives.eContents().get(7);
+		private final RuleCall cAlgorithmExpressionParserRuleCall_8 = (RuleCall)cAlternatives.eContents().get(8);
 		
 		//PrimaryExpression returns Expression:
-		//	Literal | FeatureCall | UnitConstructionOperator | ArrayConstructionOperator | ArrayConcatenationOperator |
-		//	ParenthesizedExpression | EndExpression | AlgorithmExpression;
+		//	Literal | FeatureCall | DerivativeOperator | UnitConstructionOperator | ArrayConstructionOperator |
+		//	ArrayConcatenationOperator | ParenthesizedExpression | EndExpression | AlgorithmExpression;
 		public ParserRule getRule() { return rule; }
 
-		//Literal | FeatureCall | UnitConstructionOperator | ArrayConstructionOperator | ArrayConcatenationOperator |
-		//ParenthesizedExpression | EndExpression | AlgorithmExpression
+		//Literal | FeatureCall | DerivativeOperator | UnitConstructionOperator | ArrayConstructionOperator |
+		//ArrayConcatenationOperator | ParenthesizedExpression | EndExpression | AlgorithmExpression
 		public Alternatives getAlternatives() { return cAlternatives; }
 
 		//Literal
@@ -2468,23 +2477,26 @@ public class MscriptGrammarAccess extends AbstractGrammarElementFinder {
 		//FeatureCall
 		public RuleCall getFeatureCallParserRuleCall_1() { return cFeatureCallParserRuleCall_1; }
 
+		//DerivativeOperator
+		public RuleCall getDerivativeOperatorParserRuleCall_2() { return cDerivativeOperatorParserRuleCall_2; }
+
 		//UnitConstructionOperator
-		public RuleCall getUnitConstructionOperatorParserRuleCall_2() { return cUnitConstructionOperatorParserRuleCall_2; }
+		public RuleCall getUnitConstructionOperatorParserRuleCall_3() { return cUnitConstructionOperatorParserRuleCall_3; }
 
 		//ArrayConstructionOperator
-		public RuleCall getArrayConstructionOperatorParserRuleCall_3() { return cArrayConstructionOperatorParserRuleCall_3; }
+		public RuleCall getArrayConstructionOperatorParserRuleCall_4() { return cArrayConstructionOperatorParserRuleCall_4; }
 
 		//ArrayConcatenationOperator
-		public RuleCall getArrayConcatenationOperatorParserRuleCall_4() { return cArrayConcatenationOperatorParserRuleCall_4; }
+		public RuleCall getArrayConcatenationOperatorParserRuleCall_5() { return cArrayConcatenationOperatorParserRuleCall_5; }
 
 		//ParenthesizedExpression
-		public RuleCall getParenthesizedExpressionParserRuleCall_5() { return cParenthesizedExpressionParserRuleCall_5; }
+		public RuleCall getParenthesizedExpressionParserRuleCall_6() { return cParenthesizedExpressionParserRuleCall_6; }
 
 		//EndExpression
-		public RuleCall getEndExpressionParserRuleCall_6() { return cEndExpressionParserRuleCall_6; }
+		public RuleCall getEndExpressionParserRuleCall_7() { return cEndExpressionParserRuleCall_7; }
 
 		//AlgorithmExpression
-		public RuleCall getAlgorithmExpressionParserRuleCall_7() { return cAlgorithmExpressionParserRuleCall_7; }
+		public RuleCall getAlgorithmExpressionParserRuleCall_8() { return cAlgorithmExpressionParserRuleCall_8; }
 	}
 
 	public class AssignablePrimaryExpressionElements extends AbstractParserRuleElementFinder {
@@ -2985,6 +2997,34 @@ public class MscriptGrammarAccess extends AbstractGrammarElementFinder {
 		public RuleCall getNTerminalRuleCall_1() { return cNTerminalRuleCall_1; }
 	}
 
+	public class DerivativeOperatorElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "DerivativeOperator");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cDerKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cVariableAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final CrossReference cVariableCallableElementCrossReference_1_0 = (CrossReference)cVariableAssignment_1.eContents().get(0);
+		private final RuleCall cVariableCallableElementValidIDParserRuleCall_1_0_1 = (RuleCall)cVariableCallableElementCrossReference_1_0.eContents().get(1);
+		
+		//DerivativeOperator:
+		//	"der" variable=[CallableElement|ValidID];
+		public ParserRule getRule() { return rule; }
+
+		//"der" variable=[CallableElement|ValidID]
+		public Group getGroup() { return cGroup; }
+
+		//"der"
+		public Keyword getDerKeyword_0() { return cDerKeyword_0; }
+
+		//variable=[CallableElement|ValidID]
+		public Assignment getVariableAssignment_1() { return cVariableAssignment_1; }
+
+		//[CallableElement|ValidID]
+		public CrossReference getVariableCallableElementCrossReference_1_0() { return cVariableCallableElementCrossReference_1_0; }
+
+		//ValidID
+		public RuleCall getVariableCallableElementValidIDParserRuleCall_1_0_1() { return cVariableCallableElementValidIDParserRuleCall_1_0_1; }
+	}
+
 	public class ArrayConstructionOperatorElements extends AbstractParserRuleElementFinder {
 		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "ArrayConstructionOperator");
 		private final Group cGroup = (Group)rule.eContents().get(1);
@@ -4126,6 +4166,34 @@ public class MscriptGrammarAccess extends AbstractGrammarElementFinder {
 	}
 	
 	
+	public class FunctionKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "FunctionKind");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cStatefulEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cStatefulStatefulKeyword_0_0 = (Keyword)cStatefulEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cContinuousEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cContinuousContinuousKeyword_1_0 = (Keyword)cContinuousEnumLiteralDeclaration_1.eContents().get(0);
+		
+		//enum FunctionKind:
+		//	Stateful="stateful" | Continuous="continuous";
+		public EnumRule getRule() { return rule; }
+
+		//Stateful="stateful" | Continuous="continuous"
+		public Alternatives getAlternatives() { return cAlternatives; }
+
+		//Stateful="stateful"
+		public EnumLiteralDeclaration getStatefulEnumLiteralDeclaration_0() { return cStatefulEnumLiteralDeclaration_0; }
+
+		//"stateful"
+		public Keyword getStatefulStatefulKeyword_0_0() { return cStatefulStatefulKeyword_0_0; }
+
+		//Continuous="continuous"
+		public EnumLiteralDeclaration getContinuousEnumLiteralDeclaration_1() { return cContinuousEnumLiteralDeclaration_1; }
+
+		//"continuous"
+		public Keyword getContinuousContinuousKeyword_1_0() { return cContinuousContinuousKeyword_1_0; }
+	}
+
 	public class AssertionStatusKindElements extends AbstractEnumRuleElementFinder {
 		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "AssertionStatusKind");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
@@ -4395,6 +4463,7 @@ public class MscriptGrammarAccess extends AbstractGrammarElementFinder {
 	private RecordDefinitionElements pRecordDefinition;
 	private RecordFieldDeclarationElements pRecordFieldDeclaration;
 	private FunctionDefinitionElements pFunctionDefinition;
+	private FunctionKindElements unknownRuleFunctionKind;
 	private TemplateParameterDeclarationElements pTemplateParameterDeclaration;
 	private InputParameterDeclarationElements pInputParameterDeclaration;
 	private OutputParameterDeclarationElements pOutputParameterDeclaration;
@@ -4465,6 +4534,7 @@ public class MscriptGrammarAccess extends AbstractGrammarElementFinder {
 	private PrimitiveStepExpressionElements pPrimitiveStepExpression;
 	private StepLiteralElements pStepLiteral;
 	private StepNElements pStepN;
+	private DerivativeOperatorElements pDerivativeOperator;
 	private ArrayConstructionOperatorElements pArrayConstructionOperator;
 	private ArrayConstructionIterationClauseElements pArrayConstructionIterationClause;
 	private ArrayConcatenationOperatorElements pArrayConcatenationOperator;
@@ -4612,7 +4682,7 @@ public class MscriptGrammarAccess extends AbstractGrammarElementFinder {
 	/// *
 	// * Function
 	// * / FunctionDefinition:
-	//	stateful?="stateful"? "func" name=ValidID ("<" templateParameterDeclarations+=TemplateParameterDeclaration (","
+	//	kind=FunctionKind? "func" name=ValidID ("<" templateParameterDeclarations+=TemplateParameterDeclaration (","
 	//	templateParameterDeclarations+=TemplateParameterDeclaration)* ">")? "("
 	//	(inputParameterDeclarations+=InputParameterDeclaration ("," inputParameterDeclarations+=InputParameterDeclaration)*)?
 	//	")" "->" outputParameterDeclarations+=OutputParameterDeclaration (","
@@ -4627,6 +4697,16 @@ public class MscriptGrammarAccess extends AbstractGrammarElementFinder {
 		return getFunctionDefinitionAccess().getRule();
 	}
 
+	//enum FunctionKind:
+	//	Stateful="stateful" | Continuous="continuous";
+	public FunctionKindElements getFunctionKindAccess() {
+		return (unknownRuleFunctionKind != null) ? unknownRuleFunctionKind : (unknownRuleFunctionKind = new FunctionKindElements());
+	}
+	
+	public EnumRule getFunctionKindRule() {
+		return getFunctionKindAccess().getRule();
+	}
+
 	//TemplateParameterDeclaration:
 	//	name=ValidID;
 	public TemplateParameterDeclarationElements getTemplateParameterDeclarationAccess() {
@@ -4711,7 +4791,7 @@ public class MscriptGrammarAccess extends AbstractGrammarElementFinder {
 	}
 
 	//Equation:
-	//	leftHandSide=Expression "=" rightHandSide=Expression ";";
+	//	initial?="initial"? leftHandSide=Expression "=" rightHandSide=Expression ";";
 	public EquationElements getEquationAccess() {
 		return (pEquation != null) ? pEquation : (pEquation = new EquationElements());
 	}
@@ -5168,8 +5248,8 @@ public class MscriptGrammarAccess extends AbstractGrammarElementFinder {
 	}
 
 	//PrimaryExpression returns Expression:
-	//	Literal | FeatureCall | UnitConstructionOperator | ArrayConstructionOperator | ArrayConcatenationOperator |
-	//	ParenthesizedExpression | EndExpression | AlgorithmExpression;
+	//	Literal | FeatureCall | DerivativeOperator | UnitConstructionOperator | ArrayConstructionOperator |
+	//	ArrayConcatenationOperator | ParenthesizedExpression | EndExpression | AlgorithmExpression;
 	public PrimaryExpressionElements getPrimaryExpressionAccess() {
 		return (pPrimaryExpression != null) ? pPrimaryExpression : (pPrimaryExpression = new PrimaryExpressionElements());
 	}
@@ -5349,6 +5429,16 @@ public class MscriptGrammarAccess extends AbstractGrammarElementFinder {
 		return getStepNAccess().getRule();
 	}
 
+	//DerivativeOperator:
+	//	"der" variable=[CallableElement|ValidID];
+	public DerivativeOperatorElements getDerivativeOperatorAccess() {
+		return (pDerivativeOperator != null) ? pDerivativeOperator : (pDerivativeOperator = new DerivativeOperatorElements());
+	}
+	
+	public ParserRule getDerivativeOperatorRule() {
+		return getDerivativeOperatorAccess().getRule();
+	}
+
 	//ArrayConstructionOperator:
 	//	"{" expressions+=Expression (("," expressions+=Expression)* | "for" iterationClauses+=ArrayConstructionIterationClause
 	//	("," iterationClauses+=ArrayConstructionIterationClause)*) "}";

+ 9 - 2
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/Mscript.xtext

@@ -68,7 +68,7 @@ RecordFieldDeclaration:
  */
  
 FunctionDefinition:
-	(stateful?='stateful')? 'func' name=ValidID
+	(kind=FunctionKind)? 'func' name=ValidID
 			('<' templateParameterDeclarations+=TemplateParameterDeclaration (',' templateParameterDeclarations+=TemplateParameterDeclaration)* '>')?
 			'(' (inputParameterDeclarations+=InputParameterDeclaration (',' inputParameterDeclarations+=InputParameterDeclaration)*)? ')'
 			'->' outputParameterDeclarations+=OutputParameterDeclaration (',' outputParameterDeclarations+=OutputParameterDeclaration)* '{'
@@ -79,6 +79,9 @@ FunctionDefinition:
 		equations+=Equation)*
 	'}';
 
+enum FunctionKind:
+	Stateful='stateful' | Continuous='continuous';
+	
 TemplateParameterDeclaration:
 	name=ValidID;
 
@@ -110,7 +113,7 @@ FunctionObjectDeclaration:
 	'fob' name=ValidID ':' functionName=[FunctionDefinition|QualifiedName] ('<' templateArguments+=Expression (',' templateArguments+=Expression)* '>')? ';';
 
 Equation:
-	leftHandSide=Expression '=' rightHandSide=Expression ';';
+	(initial?='initial')? leftHandSide=Expression '=' rightHandSide=Expression ';';
 
 /*
  * Data type specifier
@@ -266,6 +269,7 @@ ArraySubscript:
 PrimaryExpression returns Expression:
 	Literal |
 	FeatureCall |
+	DerivativeOperator |
 	UnitConstructionOperator |
 	ArrayConstructionOperator |
 	ArrayConcatenationOperator |
@@ -325,6 +329,9 @@ StepLiteral:
 StepN:
 	{StepN} N;
 
+DerivativeOperator:
+	'der' variable=[CallableElement|ValidID];
+
 ArrayConstructionOperator:
 	'{' expressions+=Expression ((',' expressions+=Expression)* | 'for' iterationClauses+=ArrayConstructionIterationClause (',' iterationClauses+=ArrayConstructionIterationClause)*) '}';
 

+ 9 - 0
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/AstFactory.java

@@ -268,6 +268,15 @@ public interface AstFactory extends EFactory {
 	 */
 	IterationAccumulator createIterationAccumulator();
 
+	/**
+	 * Returns a new object of class '<em>Derivative Operator</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Derivative Operator</em>'.
+	 * @generated
+	 */
+	DerivativeOperator createDerivativeOperator();
+
 	/**
 	 * Returns a new object of class '<em>Array Construction Operator</em>'.
 	 * <!-- begin-user-doc -->

+ 189 - 64
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/AstPackage.java

@@ -391,13 +391,13 @@ public interface AstPackage extends EPackage {
 	int FUNCTION_DEFINITION__NAME = DEFINITION__NAME;
 
 	/**
-	 * The feature id for the '<em><b>Stateful</b></em>' attribute.
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int FUNCTION_DEFINITION__STATEFUL = DEFINITION_FEATURE_COUNT + 0;
+	int FUNCTION_DEFINITION__KIND = DEFINITION_FEATURE_COUNT + 0;
 
 	/**
 	 * The feature id for the '<em><b>Template Parameter Declarations</b></em>' containment reference list.
@@ -755,6 +755,15 @@ public interface AstPackage extends EPackage {
 	 */
 	int FUNCTION_OBJECT_DECLARATION_FEATURE_COUNT = CALLABLE_ELEMENT_FEATURE_COUNT + 3;
 
+	/**
+	 * The feature id for the '<em><b>Initial</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EQUATION__INITIAL = 0;
+
 	/**
 	 * The feature id for the '<em><b>Left Hand Side</b></em>' containment reference.
 	 * <!-- begin-user-doc -->
@@ -762,7 +771,7 @@ public interface AstPackage extends EPackage {
 	 * @generated
 	 * @ordered
 	 */
-	int EQUATION__LEFT_HAND_SIDE = 0;
+	int EQUATION__LEFT_HAND_SIDE = 1;
 
 	/**
 	 * The feature id for the '<em><b>Right Hand Side</b></em>' containment reference.
@@ -771,7 +780,7 @@ public interface AstPackage extends EPackage {
 	 * @generated
 	 * @ordered
 	 */
-	int EQUATION__RIGHT_HAND_SIDE = 1;
+	int EQUATION__RIGHT_HAND_SIDE = 2;
 
 	/**
 	 * The number of structural features of the '<em>Equation</em>' class.
@@ -780,7 +789,7 @@ public interface AstPackage extends EPackage {
 	 * @generated
 	 * @ordered
 	 */
-	int EQUATION_FEATURE_COUNT = 2;
+	int EQUATION_FEATURE_COUNT = 3;
 
 	/**
 	 * The meta object id for the '{@link org.eclipselabs.mscript.language.ast.impl.DataTypeSpecifierImpl <em>Data Type Specifier</em>}' class.
@@ -1280,6 +1289,34 @@ public interface AstPackage extends EPackage {
 	 */
 	int ITERATION_ACCUMULATOR_FEATURE_COUNT = CALLABLE_ELEMENT_FEATURE_COUNT + 2;
 
+	/**
+	 * The meta object id for the '{@link org.eclipselabs.mscript.language.ast.impl.DerivativeOperatorImpl <em>Derivative Operator</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipselabs.mscript.language.ast.impl.DerivativeOperatorImpl
+	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getDerivativeOperator()
+	 * @generated
+	 */
+	int DERIVATIVE_OPERATOR = 31;
+
+	/**
+	 * The feature id for the '<em><b>Variable</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DERIVATIVE_OPERATOR__VARIABLE = TypeSystemPackage.EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Derivative Operator</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DERIVATIVE_OPERATOR_FEATURE_COUNT = TypeSystemPackage.EXPRESSION_FEATURE_COUNT + 1;
+
 	/**
 	 * The meta object id for the '{@link org.eclipselabs.mscript.language.ast.impl.ArrayConstructionOperatorImpl <em>Array Construction Operator</em>}' class.
 	 * <!-- begin-user-doc -->
@@ -1288,7 +1325,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getArrayConstructionOperator()
 	 * @generated
 	 */
-	int ARRAY_CONSTRUCTION_OPERATOR = 31;
+	int ARRAY_CONSTRUCTION_OPERATOR = 32;
 
 	/**
 	 * The feature id for the '<em><b>Expressions</b></em>' containment reference list.
@@ -1325,7 +1362,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getArrayConstructionIterationClause()
 	 * @generated
 	 */
-	int ARRAY_CONSTRUCTION_ITERATION_CLAUSE = 32;
+	int ARRAY_CONSTRUCTION_ITERATION_CLAUSE = 33;
 
 	/**
 	 * The feature id for the '<em><b>Variable Name</b></em>' attribute.
@@ -1362,7 +1399,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getArrayConcatenationOperator()
 	 * @generated
 	 */
-	int ARRAY_CONCATENATION_OPERATOR = 33;
+	int ARRAY_CONCATENATION_OPERATOR = 34;
 
 	/**
 	 * The feature id for the '<em><b>Rows</b></em>' containment reference list.
@@ -1390,7 +1427,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getExpressionList()
 	 * @generated
 	 */
-	int EXPRESSION_LIST = 34;
+	int EXPRESSION_LIST = 35;
 
 	/**
 	 * The feature id for the '<em><b>Expressions</b></em>' containment reference list.
@@ -1418,7 +1455,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getUnitConstructionOperator()
 	 * @generated
 	 */
-	int UNIT_CONSTRUCTION_OPERATOR = 35;
+	int UNIT_CONSTRUCTION_OPERATOR = 36;
 
 	/**
 	 * The feature id for the '<em><b>Unit</b></em>' containment reference.
@@ -1446,7 +1483,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getParenthesizedExpression()
 	 * @generated
 	 */
-	int PARENTHESIZED_EXPRESSION = 36;
+	int PARENTHESIZED_EXPRESSION = 37;
 
 	/**
 	 * The feature id for the '<em><b>Expressions</b></em>' containment reference list.
@@ -1474,7 +1511,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getEndExpression()
 	 * @generated
 	 */
-	int END_EXPRESSION = 37;
+	int END_EXPRESSION = 38;
 
 	/**
 	 * The number of structural features of the '<em>End Expression</em>' class.
@@ -1493,7 +1530,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getRangeExpression()
 	 * @generated
 	 */
-	int RANGE_EXPRESSION = 38;
+	int RANGE_EXPRESSION = 39;
 
 	/**
 	 * The feature id for the '<em><b>Operands</b></em>' containment reference list.
@@ -1521,7 +1558,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getImpliesExpression()
 	 * @generated
 	 */
-	int IMPLIES_EXPRESSION = 39;
+	int IMPLIES_EXPRESSION = 40;
 
 	/**
 	 * The feature id for the '<em><b>Left Operand</b></em>' containment reference.
@@ -1558,7 +1595,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getLogicalOrExpression()
 	 * @generated
 	 */
-	int LOGICAL_OR_EXPRESSION = 40;
+	int LOGICAL_OR_EXPRESSION = 41;
 
 	/**
 	 * The feature id for the '<em><b>Left Operand</b></em>' containment reference.
@@ -1595,7 +1632,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getLogicalAndExpression()
 	 * @generated
 	 */
-	int LOGICAL_AND_EXPRESSION = 41;
+	int LOGICAL_AND_EXPRESSION = 42;
 
 	/**
 	 * The feature id for the '<em><b>Left Operand</b></em>' containment reference.
@@ -1632,7 +1669,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getEqualityExpression()
 	 * @generated
 	 */
-	int EQUALITY_EXPRESSION = 42;
+	int EQUALITY_EXPRESSION = 43;
 
 	/**
 	 * The feature id for the '<em><b>Left Operand</b></em>' containment reference.
@@ -1678,7 +1715,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getRelationalExpression()
 	 * @generated
 	 */
-	int RELATIONAL_EXPRESSION = 43;
+	int RELATIONAL_EXPRESSION = 44;
 
 	/**
 	 * The feature id for the '<em><b>Left Operand</b></em>' containment reference.
@@ -1724,7 +1761,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getTypeTestExpression()
 	 * @generated
 	 */
-	int TYPE_TEST_EXPRESSION = 44;
+	int TYPE_TEST_EXPRESSION = 45;
 
 	/**
 	 * The feature id for the '<em><b>Expression</b></em>' containment reference.
@@ -1761,7 +1798,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getAdditiveExpression()
 	 * @generated
 	 */
-	int ADDITIVE_EXPRESSION = 45;
+	int ADDITIVE_EXPRESSION = 46;
 
 	/**
 	 * The feature id for the '<em><b>Operator</b></em>' attribute.
@@ -1807,7 +1844,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getMultiplicativeExpression()
 	 * @generated
 	 */
-	int MULTIPLICATIVE_EXPRESSION = 46;
+	int MULTIPLICATIVE_EXPRESSION = 47;
 
 	/**
 	 * The feature id for the '<em><b>Operator</b></em>' attribute.
@@ -1853,7 +1890,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getPowerExpression()
 	 * @generated
 	 */
-	int POWER_EXPRESSION = 47;
+	int POWER_EXPRESSION = 48;
 
 	/**
 	 * The feature id for the '<em><b>Operand</b></em>' containment reference.
@@ -1899,7 +1936,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getUnaryExpression()
 	 * @generated
 	 */
-	int UNARY_EXPRESSION = 48;
+	int UNARY_EXPRESSION = 49;
 
 	/**
 	 * The feature id for the '<em><b>Operator</b></em>' attribute.
@@ -1936,7 +1973,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getPostfixExpression()
 	 * @generated
 	 */
-	int POSTFIX_EXPRESSION = 49;
+	int POSTFIX_EXPRESSION = 50;
 
 	/**
 	 * The feature id for the '<em><b>Operand</b></em>' containment reference.
@@ -1973,7 +2010,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getFeatureCall()
 	 * @generated
 	 */
-	int FEATURE_CALL = 50;
+	int FEATURE_CALL = 51;
 
 	/**
 	 * The feature id for the '<em><b>Feature</b></em>' reference.
@@ -2001,7 +2038,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getVariableAccess()
 	 * @generated
 	 */
-	int VARIABLE_ACCESS = 51;
+	int VARIABLE_ACCESS = 52;
 
 	/**
 	 * The feature id for the '<em><b>Feature</b></em>' reference.
@@ -2038,7 +2075,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getStepExpression()
 	 * @generated
 	 */
-	int STEP_EXPRESSION = 52;
+	int STEP_EXPRESSION = 53;
 
 	/**
 	 * The number of structural features of the '<em>Step Expression</em>' class.
@@ -2057,7 +2094,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getRangeStepExpression()
 	 * @generated
 	 */
-	int RANGE_STEP_EXPRESSION = 53;
+	int RANGE_STEP_EXPRESSION = 54;
 
 	/**
 	 * The feature id for the '<em><b>Start</b></em>' containment reference.
@@ -2094,7 +2131,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getAdditiveStepExpression()
 	 * @generated
 	 */
-	int ADDITIVE_STEP_EXPRESSION = 54;
+	int ADDITIVE_STEP_EXPRESSION = 55;
 
 	/**
 	 * The feature id for the '<em><b>Operator</b></em>' attribute.
@@ -2140,7 +2177,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getNegateStepExpression()
 	 * @generated
 	 */
-	int NEGATE_STEP_EXPRESSION = 55;
+	int NEGATE_STEP_EXPRESSION = 56;
 
 	/**
 	 * The feature id for the '<em><b>Operand</b></em>' containment reference.
@@ -2168,7 +2205,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getPrimitiveStepExpression()
 	 * @generated
 	 */
-	int PRIMITIVE_STEP_EXPRESSION = 56;
+	int PRIMITIVE_STEP_EXPRESSION = 57;
 
 	/**
 	 * The number of structural features of the '<em>Primitive Step Expression</em>' class.
@@ -2187,7 +2224,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getStepLiteral()
 	 * @generated
 	 */
-	int STEP_LITERAL = 57;
+	int STEP_LITERAL = 58;
 
 	/**
 	 * The feature id for the '<em><b>Value</b></em>' attribute.
@@ -2215,7 +2252,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getStepN()
 	 * @generated
 	 */
-	int STEP_N = 58;
+	int STEP_N = 59;
 
 	/**
 	 * The number of structural features of the '<em>Step N</em>' class.
@@ -2234,7 +2271,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getFunctionCall()
 	 * @generated
 	 */
-	int FUNCTION_CALL = 59;
+	int FUNCTION_CALL = 60;
 
 	/**
 	 * The feature id for the '<em><b>Feature</b></em>' reference.
@@ -2271,7 +2308,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getMemberVariableAccess()
 	 * @generated
 	 */
-	int MEMBER_VARIABLE_ACCESS = 60;
+	int MEMBER_VARIABLE_ACCESS = 61;
 
 	/**
 	 * The feature id for the '<em><b>Target</b></em>' containment reference.
@@ -2308,7 +2345,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getAlgorithmExpression()
 	 * @generated
 	 */
-	int ALGORITHM_EXPRESSION = 61;
+	int ALGORITHM_EXPRESSION = 62;
 
 	/**
 	 * The feature id for the '<em><b>Body</b></em>' containment reference.
@@ -2336,7 +2373,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getStatement()
 	 * @generated
 	 */
-	int STATEMENT = 63;
+	int STATEMENT = 64;
 
 	/**
 	 * The number of structural features of the '<em>Statement</em>' class.
@@ -2355,7 +2392,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getCompound()
 	 * @generated
 	 */
-	int COMPOUND = 62;
+	int COMPOUND = 63;
 
 	/**
 	 * The feature id for the '<em><b>Statements</b></em>' containment reference list.
@@ -2383,7 +2420,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getAssignment()
 	 * @generated
 	 */
-	int ASSIGNMENT = 64;
+	int ASSIGNMENT = 65;
 
 	/**
 	 * The feature id for the '<em><b>Target</b></em>' containment reference.
@@ -2420,7 +2457,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getVariableDeclaration()
 	 * @generated
 	 */
-	int VARIABLE_DECLARATION = 65;
+	int VARIABLE_DECLARATION = 66;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -2457,7 +2494,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getIfStatement()
 	 * @generated
 	 */
-	int IF_STATEMENT = 66;
+	int IF_STATEMENT = 67;
 
 	/**
 	 * The feature id for the '<em><b>Condition</b></em>' containment reference.
@@ -2503,7 +2540,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getWhileStatement()
 	 * @generated
 	 */
-	int WHILE_STATEMENT = 67;
+	int WHILE_STATEMENT = 68;
 
 	/**
 	 * The feature id for the '<em><b>Condition</b></em>' containment reference.
@@ -2540,7 +2577,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getDoWhileStatement()
 	 * @generated
 	 */
-	int DO_WHILE_STATEMENT = 68;
+	int DO_WHILE_STATEMENT = 69;
 
 	/**
 	 * The feature id for the '<em><b>Condition</b></em>' containment reference.
@@ -2577,7 +2614,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getForStatement()
 	 * @generated
 	 */
-	int FOR_STATEMENT = 69;
+	int FOR_STATEMENT = 70;
 
 	/**
 	 * The feature id for the '<em><b>Iteration Variable</b></em>' containment reference.
@@ -2623,7 +2660,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getContinueStatement()
 	 * @generated
 	 */
-	int CONTINUE_STATEMENT = 70;
+	int CONTINUE_STATEMENT = 71;
 
 	/**
 	 * The number of structural features of the '<em>Continue Statement</em>' class.
@@ -2642,7 +2679,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getBreakStatement()
 	 * @generated
 	 */
-	int BREAK_STATEMENT = 71;
+	int BREAK_STATEMENT = 72;
 
 	/**
 	 * The number of structural features of the '<em>Break Statement</em>' class.
@@ -2661,7 +2698,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getReturnStatement()
 	 * @generated
 	 */
-	int RETURN_STATEMENT = 72;
+	int RETURN_STATEMENT = 73;
 
 	/**
 	 * The feature id for the '<em><b>Expression</b></em>' containment reference.
@@ -2689,7 +2726,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getBuiltinDefinition()
 	 * @generated
 	 */
-	int BUILTIN_DEFINITION = 73;
+	int BUILTIN_DEFINITION = 74;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -2717,7 +2754,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getBuiltinFunction()
 	 * @generated
 	 */
-	int BUILTIN_FUNCTION = 74;
+	int BUILTIN_FUNCTION = 75;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -2745,7 +2782,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getBuiltinVariable()
 	 * @generated
 	 */
-	int BUILTIN_VARIABLE = 75;
+	int BUILTIN_VARIABLE = 76;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -2765,6 +2802,16 @@ public interface AstPackage extends EPackage {
 	 */
 	int BUILTIN_VARIABLE_FEATURE_COUNT = BUILTIN_DEFINITION_FEATURE_COUNT + 0;
 
+	/**
+	 * The meta object id for the '{@link org.eclipselabs.mscript.language.ast.FunctionKind <em>Function Kind</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipselabs.mscript.language.ast.FunctionKind
+	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getFunctionKind()
+	 * @generated
+	 */
+	int FUNCTION_KIND = 77;
+
 	/**
 	 * The meta object id for the '{@link org.eclipselabs.mscript.language.ast.AssertionStatusKind <em>Assertion Status Kind</em>}' enum.
 	 * <!-- begin-user-doc -->
@@ -2773,7 +2820,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getAssertionStatusKind()
 	 * @generated
 	 */
-	int ASSERTION_STATUS_KIND = 76;
+	int ASSERTION_STATUS_KIND = 78;
 
 	/**
 	 * The meta object id for the '{@link org.eclipselabs.mscript.language.ast.EqualityOperator <em>Equality Operator</em>}' enum.
@@ -2783,7 +2830,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getEqualityOperator()
 	 * @generated
 	 */
-	int EQUALITY_OPERATOR = 77;
+	int EQUALITY_OPERATOR = 79;
 
 	/**
 	 * The meta object id for the '{@link org.eclipselabs.mscript.language.ast.RelationalOperator <em>Relational Operator</em>}' enum.
@@ -2793,7 +2840,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getRelationalOperator()
 	 * @generated
 	 */
-	int RELATIONAL_OPERATOR = 78;
+	int RELATIONAL_OPERATOR = 80;
 
 	/**
 	 * The meta object id for the '{@link org.eclipselabs.mscript.language.ast.AdditiveOperator <em>Additive Operator</em>}' enum.
@@ -2803,7 +2850,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getAdditiveOperator()
 	 * @generated
 	 */
-	int ADDITIVE_OPERATOR = 79;
+	int ADDITIVE_OPERATOR = 81;
 
 	/**
 	 * The meta object id for the '{@link org.eclipselabs.mscript.language.ast.MultiplicativeOperator <em>Multiplicative Operator</em>}' enum.
@@ -2813,7 +2860,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getMultiplicativeOperator()
 	 * @generated
 	 */
-	int MULTIPLICATIVE_OPERATOR = 80;
+	int MULTIPLICATIVE_OPERATOR = 82;
 
 	/**
 	 * The meta object id for the '{@link org.eclipselabs.mscript.language.ast.PowerOperator <em>Power Operator</em>}' enum.
@@ -2823,7 +2870,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getPowerOperator()
 	 * @generated
 	 */
-	int POWER_OPERATOR = 81;
+	int POWER_OPERATOR = 83;
 
 	/**
 	 * The meta object id for the '{@link org.eclipselabs.mscript.language.ast.UnaryOperator <em>Unary Operator</em>}' enum.
@@ -2833,7 +2880,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getUnaryOperator()
 	 * @generated
 	 */
-	int UNARY_OPERATOR = 82;
+	int UNARY_OPERATOR = 84;
 
 	/**
 	 * The meta object id for the '{@link org.eclipselabs.mscript.language.ast.PostfixOperator <em>Postfix Operator</em>}' enum.
@@ -2843,7 +2890,7 @@ public interface AstPackage extends EPackage {
 	 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getPostfixOperator()
 	 * @generated
 	 */
-	int POSTFIX_OPERATOR = 83;
+	int POSTFIX_OPERATOR = 85;
 
 	/**
 	 * Returns the meta object for class '{@link org.eclipselabs.mscript.language.ast.Module <em>Module</em>}'.
@@ -3024,15 +3071,15 @@ public interface AstPackage extends EPackage {
 	EClass getFunctionDefinition();
 
 	/**
-	 * Returns the meta object for the attribute '{@link org.eclipselabs.mscript.language.ast.FunctionDefinition#isStateful <em>Stateful</em>}'.
+	 * Returns the meta object for the attribute '{@link org.eclipselabs.mscript.language.ast.FunctionDefinition#getKind <em>Kind</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Stateful</em>'.
-	 * @see org.eclipselabs.mscript.language.ast.FunctionDefinition#isStateful()
+	 * @return the meta object for the attribute '<em>Kind</em>'.
+	 * @see org.eclipselabs.mscript.language.ast.FunctionDefinition#getKind()
 	 * @see #getFunctionDefinition()
 	 * @generated
 	 */
-	EAttribute getFunctionDefinition_Stateful();
+	EAttribute getFunctionDefinition_Kind();
 
 	/**
 	 * Returns the meta object for the containment reference list '{@link org.eclipselabs.mscript.language.ast.FunctionDefinition#getTemplateParameterDeclarations <em>Template Parameter Declarations</em>}'.
@@ -3365,6 +3412,17 @@ public interface AstPackage extends EPackage {
 	 */
 	EClass getEquation();
 
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipselabs.mscript.language.ast.Equation#isInitial <em>Initial</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Initial</em>'.
+	 * @see org.eclipselabs.mscript.language.ast.Equation#isInitial()
+	 * @see #getEquation()
+	 * @generated
+	 */
+	EAttribute getEquation_Initial();
+
 	/**
 	 * Returns the meta object for the containment reference '{@link org.eclipselabs.mscript.language.ast.Equation#getLeftHandSide <em>Left Hand Side</em>}'.
 	 * <!-- begin-user-doc -->
@@ -3837,6 +3895,27 @@ public interface AstPackage extends EPackage {
 	 */
 	EReference getIterationAccumulator_Initializer();
 
+	/**
+	 * Returns the meta object for class '{@link org.eclipselabs.mscript.language.ast.DerivativeOperator <em>Derivative Operator</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Derivative Operator</em>'.
+	 * @see org.eclipselabs.mscript.language.ast.DerivativeOperator
+	 * @generated
+	 */
+	EClass getDerivativeOperator();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipselabs.mscript.language.ast.DerivativeOperator#getVariable <em>Variable</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Variable</em>'.
+	 * @see org.eclipselabs.mscript.language.ast.DerivativeOperator#getVariable()
+	 * @see #getDerivativeOperator()
+	 * @generated
+	 */
+	EReference getDerivativeOperator_Variable();
+
 	/**
 	 * Returns the meta object for class '{@link org.eclipselabs.mscript.language.ast.ArrayConstructionOperator <em>Array Construction Operator</em>}'.
 	 * <!-- begin-user-doc -->
@@ -5002,6 +5081,16 @@ public interface AstPackage extends EPackage {
 	 */
 	EClass getBuiltinVariable();
 
+	/**
+	 * Returns the meta object for enum '{@link org.eclipselabs.mscript.language.ast.FunctionKind <em>Function Kind</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Function Kind</em>'.
+	 * @see org.eclipselabs.mscript.language.ast.FunctionKind
+	 * @generated
+	 */
+	EEnum getFunctionKind();
+
 	/**
 	 * Returns the meta object for enum '{@link org.eclipselabs.mscript.language.ast.AssertionStatusKind <em>Assertion Status Kind</em>}'.
 	 * <!-- begin-user-doc -->
@@ -5259,12 +5348,12 @@ public interface AstPackage extends EPackage {
 		EClass FUNCTION_DEFINITION = eINSTANCE.getFunctionDefinition();
 
 		/**
-		 * The meta object literal for the '<em><b>Stateful</b></em>' attribute feature.
+		 * The meta object literal for the '<em><b>Kind</b></em>' attribute feature.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
 		 * @generated
 		 */
-		EAttribute FUNCTION_DEFINITION__STATEFUL = eINSTANCE.getFunctionDefinition_Stateful();
+		EAttribute FUNCTION_DEFINITION__KIND = eINSTANCE.getFunctionDefinition_Kind();
 
 		/**
 		 * The meta object literal for the '<em><b>Template Parameter Declarations</b></em>' containment reference list feature.
@@ -5534,6 +5623,14 @@ public interface AstPackage extends EPackage {
 		 */
 		EClass EQUATION = eINSTANCE.getEquation();
 
+		/**
+		 * The meta object literal for the '<em><b>Initial</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute EQUATION__INITIAL = eINSTANCE.getEquation_Initial();
+
 		/**
 		 * The meta object literal for the '<em><b>Left Hand Side</b></em>' containment reference feature.
 		 * <!-- begin-user-doc -->
@@ -5910,6 +6007,24 @@ public interface AstPackage extends EPackage {
 		 */
 		EReference ITERATION_ACCUMULATOR__INITIALIZER = eINSTANCE.getIterationAccumulator_Initializer();
 
+		/**
+		 * The meta object literal for the '{@link org.eclipselabs.mscript.language.ast.impl.DerivativeOperatorImpl <em>Derivative Operator</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipselabs.mscript.language.ast.impl.DerivativeOperatorImpl
+		 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getDerivativeOperator()
+		 * @generated
+		 */
+		EClass DERIVATIVE_OPERATOR = eINSTANCE.getDerivativeOperator();
+
+		/**
+		 * The meta object literal for the '<em><b>Variable</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference DERIVATIVE_OPERATOR__VARIABLE = eINSTANCE.getDerivativeOperator_Variable();
+
 		/**
 		 * The meta object literal for the '{@link org.eclipselabs.mscript.language.ast.impl.ArrayConstructionOperatorImpl <em>Array Construction Operator</em>}' class.
 		 * <!-- begin-user-doc -->
@@ -6880,6 +6995,16 @@ public interface AstPackage extends EPackage {
 		 */
 		EClass BUILTIN_VARIABLE = eINSTANCE.getBuiltinVariable();
 
+		/**
+		 * The meta object literal for the '{@link org.eclipselabs.mscript.language.ast.FunctionKind <em>Function Kind</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipselabs.mscript.language.ast.FunctionKind
+		 * @see org.eclipselabs.mscript.language.ast.impl.AstPackageImpl#getFunctionKind()
+		 * @generated
+		 */
+		EEnum FUNCTION_KIND = eINSTANCE.getFunctionKind();
+
 		/**
 		 * The meta object literal for the '{@link org.eclipselabs.mscript.language.ast.AssertionStatusKind <em>Assertion Status Kind</em>}' enum.
 		 * <!-- begin-user-doc -->

+ 54 - 0
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/DerivativeOperator.java

@@ -0,0 +1,54 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id$
+ */
+package org.eclipselabs.mscript.language.ast;
+
+import org.eclipselabs.mscript.typesystem.Expression;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Derivative Operator</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipselabs.mscript.language.ast.DerivativeOperator#getVariable <em>Variable</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipselabs.mscript.language.ast.AstPackage#getDerivativeOperator()
+ * @model
+ * @generated
+ */
+public interface DerivativeOperator extends Expression {
+	/**
+	 * Returns the value of the '<em><b>Variable</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Variable</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Variable</em>' reference.
+	 * @see #setVariable(CallableElement)
+	 * @see org.eclipselabs.mscript.language.ast.AstPackage#getDerivativeOperator_Variable()
+	 * @model
+	 * @generated
+	 */
+	CallableElement getVariable();
+
+	/**
+	 * Sets the value of the '{@link org.eclipselabs.mscript.language.ast.DerivativeOperator#getVariable <em>Variable</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Variable</em>' reference.
+	 * @see #getVariable()
+	 * @generated
+	 */
+	void setVariable(CallableElement value);
+
+} // DerivativeOperator

+ 27 - 0
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/Equation.java

@@ -17,6 +17,7 @@ import org.eclipselabs.mscript.typesystem.Expression;
  * <p>
  * The following features are supported:
  * <ul>
+ *   <li>{@link org.eclipselabs.mscript.language.ast.Equation#isInitial <em>Initial</em>}</li>
  *   <li>{@link org.eclipselabs.mscript.language.ast.Equation#getLeftHandSide <em>Left Hand Side</em>}</li>
  *   <li>{@link org.eclipselabs.mscript.language.ast.Equation#getRightHandSide <em>Right Hand Side</em>}</li>
  * </ul>
@@ -27,6 +28,32 @@ import org.eclipselabs.mscript.typesystem.Expression;
  * @generated
  */
 public interface Equation extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Initial</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Initial</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Initial</em>' attribute.
+	 * @see #setInitial(boolean)
+	 * @see org.eclipselabs.mscript.language.ast.AstPackage#getEquation_Initial()
+	 * @model
+	 * @generated
+	 */
+	boolean isInitial();
+
+	/**
+	 * Sets the value of the '{@link org.eclipselabs.mscript.language.ast.Equation#isInitial <em>Initial</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Initial</em>' attribute.
+	 * @see #isInitial()
+	 * @generated
+	 */
+	void setInitial(boolean value);
+
 	/**
 	 * Returns the value of the '<em><b>Left Hand Side</b></em>' containment reference.
 	 * <!-- begin-user-doc -->

+ 14 - 11
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/FunctionDefinition.java

@@ -16,7 +16,7 @@ import org.eclipse.emf.common.util.EList;
  * <p>
  * The following features are supported:
  * <ul>
- *   <li>{@link org.eclipselabs.mscript.language.ast.FunctionDefinition#isStateful <em>Stateful</em>}</li>
+ *   <li>{@link org.eclipselabs.mscript.language.ast.FunctionDefinition#getKind <em>Kind</em>}</li>
  *   <li>{@link org.eclipselabs.mscript.language.ast.FunctionDefinition#getTemplateParameterDeclarations <em>Template Parameter Declarations</em>}</li>
  *   <li>{@link org.eclipselabs.mscript.language.ast.FunctionDefinition#getInputParameterDeclarations <em>Input Parameter Declarations</em>}</li>
  *   <li>{@link org.eclipselabs.mscript.language.ast.FunctionDefinition#getOutputParameterDeclarations <em>Output Parameter Declarations</em>}</li>
@@ -34,30 +34,33 @@ import org.eclipse.emf.common.util.EList;
  */
 public interface FunctionDefinition extends Definition, CallableElement {
 	/**
-	 * Returns the value of the '<em><b>Stateful</b></em>' attribute.
+	 * Returns the value of the '<em><b>Kind</b></em>' attribute.
+	 * The literals are from the enumeration {@link org.eclipselabs.mscript.language.ast.FunctionKind}.
 	 * <!-- begin-user-doc -->
 	 * <p>
-	 * If the meaning of the '<em>Stateful</em>' attribute isn't clear,
+	 * If the meaning of the '<em>Kind</em>' attribute isn't clear,
 	 * there really should be more of a description here...
 	 * </p>
 	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Stateful</em>' attribute.
-	 * @see #setStateful(boolean)
-	 * @see org.eclipselabs.mscript.language.ast.AstPackage#getFunctionDefinition_Stateful()
+	 * @return the value of the '<em>Kind</em>' attribute.
+	 * @see org.eclipselabs.mscript.language.ast.FunctionKind
+	 * @see #setKind(FunctionKind)
+	 * @see org.eclipselabs.mscript.language.ast.AstPackage#getFunctionDefinition_Kind()
 	 * @model
 	 * @generated
 	 */
-	boolean isStateful();
+	FunctionKind getKind();
 
 	/**
-	 * Sets the value of the '{@link org.eclipselabs.mscript.language.ast.FunctionDefinition#isStateful <em>Stateful</em>}' attribute.
+	 * Sets the value of the '{@link org.eclipselabs.mscript.language.ast.FunctionDefinition#getKind <em>Kind</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Stateful</em>' attribute.
-	 * @see #isStateful()
+	 * @param value the new value of the '<em>Kind</em>' attribute.
+	 * @see org.eclipselabs.mscript.language.ast.FunctionKind
+	 * @see #getKind()
 	 * @generated
 	 */
-	void setStateful(boolean value);
+	void setKind(FunctionKind value);
 
 	/**
 	 * Returns the value of the '<em><b>Template Parameter Declarations</b></em>' containment reference list.

+ 239 - 0
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/FunctionKind.java

@@ -0,0 +1,239 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id$
+ */
+package org.eclipselabs.mscript.language.ast;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Function Kind</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipselabs.mscript.language.ast.AstPackage#getFunctionKind()
+ * @model
+ * @generated
+ */
+public enum FunctionKind implements Enumerator {
+	/**
+	 * The '<em><b>Stateless</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #STATELESS_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	STATELESS(0, "Stateless", "Stateless"),
+
+	/**
+	 * The '<em><b>Stateful</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #STATEFUL_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	STATEFUL(1, "Stateful", "Stateful"),
+
+	/**
+	 * The '<em><b>Continuous</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #CONTINUOUS_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	CONTINUOUS(2, "Continuous", "Continuous");
+
+	/**
+	 * The '<em><b>Stateless</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Stateless</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #STATELESS
+	 * @model name="Stateless"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int STATELESS_VALUE = 0;
+
+	/**
+	 * The '<em><b>Stateful</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Stateful</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #STATEFUL
+	 * @model name="Stateful"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int STATEFUL_VALUE = 1;
+
+	/**
+	 * The '<em><b>Continuous</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Continuous</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #CONTINUOUS
+	 * @model name="Continuous"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int CONTINUOUS_VALUE = 2;
+
+	/**
+	 * An array of all the '<em><b>Function Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final FunctionKind[] VALUES_ARRAY =
+		new FunctionKind[] {
+			STATELESS,
+			STATEFUL,
+			CONTINUOUS,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Function Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<FunctionKind> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Function Kind</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static FunctionKind get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			FunctionKind result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Function Kind</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static FunctionKind getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			FunctionKind result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Function Kind</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static FunctionKind get(int value) {
+		switch (value) {
+			case STATELESS_VALUE: return STATELESS;
+			case STATEFUL_VALUE: return STATEFUL;
+			case CONTINUOUS_VALUE: return CONTINUOUS;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private FunctionKind(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //FunctionKind

+ 45 - 1
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/AstFactoryImpl.java

@@ -12,7 +12,6 @@ import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.emf.ecore.impl.EFactoryImpl;
 import org.eclipse.emf.ecore.plugin.EcorePlugin;
-import org.eclipselabs.mscript.language.ast.*;
 import org.eclipselabs.mscript.language.ast.AdditiveExpression;
 import org.eclipselabs.mscript.language.ast.AdditiveOperator;
 import org.eclipselabs.mscript.language.ast.AdditiveStepExpression;
@@ -27,12 +26,16 @@ import org.eclipselabs.mscript.language.ast.AssertionStatusKind;
 import org.eclipselabs.mscript.language.ast.Assignment;
 import org.eclipselabs.mscript.language.ast.AstFactory;
 import org.eclipselabs.mscript.language.ast.AstPackage;
+import org.eclipselabs.mscript.language.ast.BreakStatement;
 import org.eclipselabs.mscript.language.ast.BuiltinDefinition;
 import org.eclipselabs.mscript.language.ast.BuiltinFunction;
 import org.eclipselabs.mscript.language.ast.BuiltinVariable;
 import org.eclipselabs.mscript.language.ast.Check;
 import org.eclipselabs.mscript.language.ast.Compound;
+import org.eclipselabs.mscript.language.ast.ContinueStatement;
 import org.eclipselabs.mscript.language.ast.DataTypeSpecifier;
+import org.eclipselabs.mscript.language.ast.DerivativeOperator;
+import org.eclipselabs.mscript.language.ast.DoWhileStatement;
 import org.eclipselabs.mscript.language.ast.EndExpression;
 import org.eclipselabs.mscript.language.ast.EnumerationDefinition;
 import org.eclipselabs.mscript.language.ast.EnumerationLiteralDeclaration;
@@ -40,10 +43,13 @@ import org.eclipselabs.mscript.language.ast.EqualityExpression;
 import org.eclipselabs.mscript.language.ast.EqualityOperator;
 import org.eclipselabs.mscript.language.ast.Equation;
 import org.eclipselabs.mscript.language.ast.ExpressionList;
+import org.eclipselabs.mscript.language.ast.ForStatement;
 import org.eclipselabs.mscript.language.ast.FunctionCall;
 import org.eclipselabs.mscript.language.ast.FunctionDefinition;
+import org.eclipselabs.mscript.language.ast.FunctionKind;
 import org.eclipselabs.mscript.language.ast.FunctionObjectDeclaration;
 import org.eclipselabs.mscript.language.ast.IfExpression;
+import org.eclipselabs.mscript.language.ast.IfStatement;
 import org.eclipselabs.mscript.language.ast.ImpliesExpression;
 import org.eclipselabs.mscript.language.ast.InputParameterDeclaration;
 import org.eclipselabs.mscript.language.ast.IterationAccumulator;
@@ -71,6 +77,7 @@ import org.eclipselabs.mscript.language.ast.RecordDefinition;
 import org.eclipselabs.mscript.language.ast.RecordFieldDeclaration;
 import org.eclipselabs.mscript.language.ast.RelationalExpression;
 import org.eclipselabs.mscript.language.ast.RelationalOperator;
+import org.eclipselabs.mscript.language.ast.ReturnStatement;
 import org.eclipselabs.mscript.language.ast.StateVariableDeclaration;
 import org.eclipselabs.mscript.language.ast.StepLiteral;
 import org.eclipselabs.mscript.language.ast.StepN;
@@ -83,6 +90,8 @@ import org.eclipselabs.mscript.language.ast.UnaryExpression;
 import org.eclipselabs.mscript.language.ast.UnaryOperator;
 import org.eclipselabs.mscript.language.ast.UnitConstructionOperator;
 import org.eclipselabs.mscript.language.ast.VariableAccess;
+import org.eclipselabs.mscript.language.ast.VariableDeclaration;
+import org.eclipselabs.mscript.language.ast.WhileStatement;
 
 /**
  * <!-- begin-user-doc -->
@@ -155,6 +164,7 @@ public class AstFactoryImpl extends EFactoryImpl implements AstFactory {
 			case AstPackage.ITERATION_CALL: return createIterationCall();
 			case AstPackage.ITERATION_VARIABLE: return createIterationVariable();
 			case AstPackage.ITERATION_ACCUMULATOR: return createIterationAccumulator();
+			case AstPackage.DERIVATIVE_OPERATOR: return createDerivativeOperator();
 			case AstPackage.ARRAY_CONSTRUCTION_OPERATOR: return createArrayConstructionOperator();
 			case AstPackage.ARRAY_CONSTRUCTION_ITERATION_CLAUSE: return createArrayConstructionIterationClause();
 			case AstPackage.ARRAY_CONCATENATION_OPERATOR: return createArrayConcatenationOperator();
@@ -209,6 +219,8 @@ public class AstFactoryImpl extends EFactoryImpl implements AstFactory {
 	@Override
 	public Object createFromString(EDataType eDataType, String initialValue) {
 		switch (eDataType.getClassifierID()) {
+			case AstPackage.FUNCTION_KIND:
+				return createFunctionKindFromString(eDataType, initialValue);
 			case AstPackage.ASSERTION_STATUS_KIND:
 				return createAssertionStatusKindFromString(eDataType, initialValue);
 			case AstPackage.EQUALITY_OPERATOR:
@@ -238,6 +250,8 @@ public class AstFactoryImpl extends EFactoryImpl implements AstFactory {
 	@Override
 	public String convertToString(EDataType eDataType, Object instanceValue) {
 		switch (eDataType.getClassifierID()) {
+			case AstPackage.FUNCTION_KIND:
+				return convertFunctionKindToString(eDataType, instanceValue);
 			case AstPackage.ASSERTION_STATUS_KIND:
 				return convertAssertionStatusKindToString(eDataType, instanceValue);
 			case AstPackage.EQUALITY_OPERATOR:
@@ -529,6 +543,16 @@ public class AstFactoryImpl extends EFactoryImpl implements AstFactory {
 		return iterationAccumulator;
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DerivativeOperator createDerivativeOperator() {
+		DerivativeOperatorImpl derivativeOperator = new DerivativeOperatorImpl();
+		return derivativeOperator;
+	}
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -939,6 +963,26 @@ public class AstFactoryImpl extends EFactoryImpl implements AstFactory {
 		return builtinVariable;
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public FunctionKind createFunctionKindFromString(EDataType eDataType, String initialValue) {
+		FunctionKind result = FunctionKind.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertFunctionKindToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->

+ 72 - 5
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/AstPackageImpl.java

@@ -37,6 +37,7 @@ import org.eclipselabs.mscript.language.ast.ContinueStatement;
 import org.eclipselabs.mscript.language.ast.DataTypeDefinition;
 import org.eclipselabs.mscript.language.ast.DataTypeSpecifier;
 import org.eclipselabs.mscript.language.ast.Definition;
+import org.eclipselabs.mscript.language.ast.DerivativeOperator;
 import org.eclipselabs.mscript.language.ast.DoWhileStatement;
 import org.eclipselabs.mscript.language.ast.EndExpression;
 import org.eclipselabs.mscript.language.ast.EnumerationDefinition;
@@ -49,6 +50,7 @@ import org.eclipselabs.mscript.language.ast.FeatureCall;
 import org.eclipselabs.mscript.language.ast.ForStatement;
 import org.eclipselabs.mscript.language.ast.FunctionCall;
 import org.eclipselabs.mscript.language.ast.FunctionDefinition;
+import org.eclipselabs.mscript.language.ast.FunctionKind;
 import org.eclipselabs.mscript.language.ast.FunctionObjectDeclaration;
 import org.eclipselabs.mscript.language.ast.IfExpression;
 import org.eclipselabs.mscript.language.ast.IfStatement;
@@ -324,6 +326,13 @@ public class AstPackageImpl extends EPackageImpl implements AstPackage {
 	 */
 	private EClass iterationAccumulatorEClass = null;
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass derivativeOperatorEClass = null;
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -639,6 +648,13 @@ public class AstPackageImpl extends EPackageImpl implements AstPackage {
 	 */
 	private EClass builtinVariableEClass = null;
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum functionKindEEnum = null;
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -917,7 +933,7 @@ public class AstPackageImpl extends EPackageImpl implements AstPackage {
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EAttribute getFunctionDefinition_Stateful() {
+	public EAttribute getFunctionDefinition_Kind() {
 		return (EAttribute)functionDefinitionEClass.getEStructuralFeatures().get(0);
 	}
 
@@ -1200,13 +1216,22 @@ public class AstPackageImpl extends EPackageImpl implements AstPackage {
 		return equationEClass;
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getEquation_Initial() {
+		return (EAttribute)equationEClass.getEStructuralFeatures().get(0);
+	}
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
 	public EReference getEquation_LeftHandSide() {
-		return (EReference)equationEClass.getEStructuralFeatures().get(0);
+		return (EReference)equationEClass.getEStructuralFeatures().get(1);
 	}
 
 	/**
@@ -1215,7 +1240,7 @@ public class AstPackageImpl extends EPackageImpl implements AstPackage {
 	 * @generated
 	 */
 	public EReference getEquation_RightHandSide() {
-		return (EReference)equationEClass.getEStructuralFeatures().get(1);
+		return (EReference)equationEClass.getEStructuralFeatures().get(2);
 	}
 
 	/**
@@ -1596,6 +1621,24 @@ public class AstPackageImpl extends EPackageImpl implements AstPackage {
 		return (EReference)iterationAccumulatorEClass.getEStructuralFeatures().get(1);
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getDerivativeOperator() {
+		return derivativeOperatorEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getDerivativeOperator_Variable() {
+		return (EReference)derivativeOperatorEClass.getEStructuralFeatures().get(0);
+	}
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -2586,6 +2629,15 @@ public class AstPackageImpl extends EPackageImpl implements AstPackage {
 		return builtinVariableEClass;
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getFunctionKind() {
+		return functionKindEEnum;
+	}
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -2711,7 +2763,7 @@ public class AstPackageImpl extends EPackageImpl implements AstPackage {
 		createEReference(recordFieldDeclarationEClass, RECORD_FIELD_DECLARATION__TYPE);
 
 		functionDefinitionEClass = createEClass(FUNCTION_DEFINITION);
-		createEAttribute(functionDefinitionEClass, FUNCTION_DEFINITION__STATEFUL);
+		createEAttribute(functionDefinitionEClass, FUNCTION_DEFINITION__KIND);
 		createEReference(functionDefinitionEClass, FUNCTION_DEFINITION__TEMPLATE_PARAMETER_DECLARATIONS);
 		createEReference(functionDefinitionEClass, FUNCTION_DEFINITION__INPUT_PARAMETER_DECLARATIONS);
 		createEReference(functionDefinitionEClass, FUNCTION_DEFINITION__OUTPUT_PARAMETER_DECLARATIONS);
@@ -2753,6 +2805,7 @@ public class AstPackageImpl extends EPackageImpl implements AstPackage {
 		createEReference(functionObjectDeclarationEClass, FUNCTION_OBJECT_DECLARATION__TEMPLATE_ARGUMENTS);
 
 		equationEClass = createEClass(EQUATION);
+		createEAttribute(equationEClass, EQUATION__INITIAL);
 		createEReference(equationEClass, EQUATION__LEFT_HAND_SIDE);
 		createEReference(equationEClass, EQUATION__RIGHT_HAND_SIDE);
 
@@ -2810,6 +2863,9 @@ public class AstPackageImpl extends EPackageImpl implements AstPackage {
 		createEAttribute(iterationAccumulatorEClass, ITERATION_ACCUMULATOR__NAME);
 		createEReference(iterationAccumulatorEClass, ITERATION_ACCUMULATOR__INITIALIZER);
 
+		derivativeOperatorEClass = createEClass(DERIVATIVE_OPERATOR);
+		createEReference(derivativeOperatorEClass, DERIVATIVE_OPERATOR__VARIABLE);
+
 		arrayConstructionOperatorEClass = createEClass(ARRAY_CONSTRUCTION_OPERATOR);
 		createEReference(arrayConstructionOperatorEClass, ARRAY_CONSTRUCTION_OPERATOR__EXPRESSIONS);
 		createEReference(arrayConstructionOperatorEClass, ARRAY_CONSTRUCTION_OPERATOR__ITERATION_CLAUSES);
@@ -2966,6 +3022,7 @@ public class AstPackageImpl extends EPackageImpl implements AstPackage {
 		builtinVariableEClass = createEClass(BUILTIN_VARIABLE);
 
 		// Create enums
+		functionKindEEnum = createEEnum(FUNCTION_KIND);
 		assertionStatusKindEEnum = createEEnum(ASSERTION_STATUS_KIND);
 		equalityOperatorEEnum = createEEnum(EQUALITY_OPERATOR);
 		relationalOperatorEEnum = createEEnum(RELATIONAL_OPERATOR);
@@ -3027,6 +3084,7 @@ public class AstPackageImpl extends EPackageImpl implements AstPackage {
 		iterationCallEClass.getESuperTypes().add(theTypeSystemPackage.getExpression());
 		iterationVariableEClass.getESuperTypes().add(this.getCallableElement());
 		iterationAccumulatorEClass.getESuperTypes().add(this.getCallableElement());
+		derivativeOperatorEClass.getESuperTypes().add(theTypeSystemPackage.getExpression());
 		arrayConstructionOperatorEClass.getESuperTypes().add(theTypeSystemPackage.getExpression());
 		arrayConcatenationOperatorEClass.getESuperTypes().add(theTypeSystemPackage.getExpression());
 		unitConstructionOperatorEClass.getESuperTypes().add(theTypeSystemPackage.getExpression());
@@ -3096,7 +3154,7 @@ public class AstPackageImpl extends EPackageImpl implements AstPackage {
 		initEReference(getRecordFieldDeclaration_Type(), this.getDataTypeSpecifier(), null, "type", null, 0, 1, RecordFieldDeclaration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		initEClass(functionDefinitionEClass, FunctionDefinition.class, "FunctionDefinition", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getFunctionDefinition_Stateful(), ecorePackage.getEBoolean(), "stateful", null, 0, 1, FunctionDefinition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getFunctionDefinition_Kind(), this.getFunctionKind(), "kind", null, 0, 1, FunctionDefinition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getFunctionDefinition_TemplateParameterDeclarations(), this.getTemplateParameterDeclaration(), null, "templateParameterDeclarations", null, 0, -1, FunctionDefinition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getFunctionDefinition_InputParameterDeclarations(), this.getInputParameterDeclaration(), null, "inputParameterDeclarations", null, 0, -1, FunctionDefinition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getFunctionDefinition_OutputParameterDeclarations(), this.getOutputParameterDeclaration(), null, "outputParameterDeclarations", null, 0, -1, FunctionDefinition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
@@ -3142,6 +3200,7 @@ public class AstPackageImpl extends EPackageImpl implements AstPackage {
 		initEReference(getFunctionObjectDeclaration_TemplateArguments(), theTypeSystemPackage.getExpression(), null, "templateArguments", null, 0, -1, FunctionObjectDeclaration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		initEClass(equationEClass, Equation.class, "Equation", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getEquation_Initial(), ecorePackage.getEBoolean(), "initial", null, 0, 1, Equation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getEquation_LeftHandSide(), theTypeSystemPackage.getExpression(), null, "leftHandSide", null, 0, 1, Equation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getEquation_RightHandSide(), theTypeSystemPackage.getExpression(), null, "rightHandSide", null, 0, 1, Equation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
@@ -3199,6 +3258,9 @@ public class AstPackageImpl extends EPackageImpl implements AstPackage {
 		initEAttribute(getIterationAccumulator_Name(), ecorePackage.getEString(), "name", null, 0, 1, IterationAccumulator.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getIterationAccumulator_Initializer(), theTypeSystemPackage.getExpression(), null, "initializer", null, 0, 1, IterationAccumulator.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
+		initEClass(derivativeOperatorEClass, DerivativeOperator.class, "DerivativeOperator", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getDerivativeOperator_Variable(), this.getCallableElement(), null, "variable", null, 0, 1, DerivativeOperator.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
 		initEClass(arrayConstructionOperatorEClass, ArrayConstructionOperator.class, "ArrayConstructionOperator", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEReference(getArrayConstructionOperator_Expressions(), theTypeSystemPackage.getExpression(), null, "expressions", null, 0, -1, ArrayConstructionOperator.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getArrayConstructionOperator_IterationClauses(), this.getArrayConstructionIterationClause(), null, "iterationClauses", null, 0, -1, ArrayConstructionOperator.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
@@ -3355,6 +3417,11 @@ public class AstPackageImpl extends EPackageImpl implements AstPackage {
 		initEClass(builtinVariableEClass, BuiltinVariable.class, "BuiltinVariable", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 
 		// Initialize enums and add enum literals
+		initEEnum(functionKindEEnum, FunctionKind.class, "FunctionKind");
+		addEEnumLiteral(functionKindEEnum, FunctionKind.STATELESS);
+		addEEnumLiteral(functionKindEEnum, FunctionKind.STATEFUL);
+		addEEnumLiteral(functionKindEEnum, FunctionKind.CONTINUOUS);
+
 		initEEnum(assertionStatusKindEEnum, AssertionStatusKind.class, "AssertionStatusKind");
 		addEEnumLiteral(assertionStatusKindEEnum, AssertionStatusKind.INFO);
 		addEEnumLiteral(assertionStatusKindEEnum, AssertionStatusKind.WARNING);

+ 0 - 1
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/BreakStatementImpl.java

@@ -7,7 +7,6 @@
 package org.eclipselabs.mscript.language.ast.impl;
 
 import org.eclipse.emf.ecore.EClass;
-
 import org.eclipselabs.mscript.language.ast.AstPackage;
 import org.eclipselabs.mscript.language.ast.BreakStatement;
 

+ 0 - 1
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/ContinueStatementImpl.java

@@ -7,7 +7,6 @@
 package org.eclipselabs.mscript.language.ast.impl;
 
 import org.eclipse.emf.ecore.EClass;
-
 import org.eclipselabs.mscript.language.ast.AstPackage;
 import org.eclipselabs.mscript.language.ast.ContinueStatement;
 

+ 158 - 0
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/DerivativeOperatorImpl.java

@@ -0,0 +1,158 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id$
+ */
+package org.eclipselabs.mscript.language.ast.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipselabs.mscript.language.ast.AstPackage;
+import org.eclipselabs.mscript.language.ast.CallableElement;
+import org.eclipselabs.mscript.language.ast.DerivativeOperator;
+import org.eclipselabs.mscript.typesystem.impl.ExpressionImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Derivative Operator</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipselabs.mscript.language.ast.impl.DerivativeOperatorImpl#getVariable <em>Variable</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class DerivativeOperatorImpl extends ExpressionImpl implements DerivativeOperator {
+	/**
+	 * The cached value of the '{@link #getVariable() <em>Variable</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getVariable()
+	 * @generated
+	 * @ordered
+	 */
+	protected CallableElement variable;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected DerivativeOperatorImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return AstPackage.Literals.DERIVATIVE_OPERATOR;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public CallableElement getVariable() {
+		if (variable != null && variable.eIsProxy()) {
+			InternalEObject oldVariable = (InternalEObject)variable;
+			variable = (CallableElement)eResolveProxy(oldVariable);
+			if (variable != oldVariable) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, AstPackage.DERIVATIVE_OPERATOR__VARIABLE, oldVariable, variable));
+			}
+		}
+		return variable;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public CallableElement basicGetVariable() {
+		return variable;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setVariable(CallableElement newVariable) {
+		CallableElement oldVariable = variable;
+		variable = newVariable;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, AstPackage.DERIVATIVE_OPERATOR__VARIABLE, oldVariable, variable));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case AstPackage.DERIVATIVE_OPERATOR__VARIABLE:
+				if (resolve) return getVariable();
+				return basicGetVariable();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case AstPackage.DERIVATIVE_OPERATOR__VARIABLE:
+				setVariable((CallableElement)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case AstPackage.DERIVATIVE_OPERATOR__VARIABLE:
+				setVariable((CallableElement)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case AstPackage.DERIVATIVE_OPERATOR__VARIABLE:
+				return variable != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //DerivativeOperatorImpl

+ 0 - 4
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/DoWhileStatementImpl.java

@@ -8,16 +8,12 @@ package org.eclipselabs.mscript.language.ast.impl;
 
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
-
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
-
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
-
 import org.eclipselabs.mscript.language.ast.AstPackage;
 import org.eclipselabs.mscript.language.ast.DoWhileStatement;
 import org.eclipselabs.mscript.language.ast.Statement;
-
 import org.eclipselabs.mscript.typesystem.Expression;
 
 /**

+ 68 - 0
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/EquationImpl.java

@@ -23,6 +23,7 @@ import org.eclipselabs.mscript.typesystem.Expression;
  * <p>
  * The following features are implemented:
  * <ul>
+ *   <li>{@link org.eclipselabs.mscript.language.ast.impl.EquationImpl#isInitial <em>Initial</em>}</li>
  *   <li>{@link org.eclipselabs.mscript.language.ast.impl.EquationImpl#getLeftHandSide <em>Left Hand Side</em>}</li>
  *   <li>{@link org.eclipselabs.mscript.language.ast.impl.EquationImpl#getRightHandSide <em>Right Hand Side</em>}</li>
  * </ul>
@@ -31,6 +32,26 @@ import org.eclipselabs.mscript.typesystem.Expression;
  * @generated
  */
 public class EquationImpl extends MinimalEObjectImpl.Container implements Equation {
+	/**
+	 * The default value of the '{@link #isInitial() <em>Initial</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isInitial()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean INITIAL_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isInitial() <em>Initial</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isInitial()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean initial = INITIAL_EDEFAULT;
+
 	/**
 	 * The cached value of the '{@link #getLeftHandSide() <em>Left Hand Side</em>}' containment reference.
 	 * <!-- begin-user-doc -->
@@ -70,6 +91,27 @@ public class EquationImpl extends MinimalEObjectImpl.Container implements Equati
 		return AstPackage.Literals.EQUATION;
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isInitial() {
+		return initial;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setInitial(boolean newInitial) {
+		boolean oldInitial = initial;
+		initial = newInitial;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, AstPackage.EQUATION__INITIAL, oldInitial, initial));
+	}
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -180,6 +222,8 @@ public class EquationImpl extends MinimalEObjectImpl.Container implements Equati
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
+			case AstPackage.EQUATION__INITIAL:
+				return isInitial();
 			case AstPackage.EQUATION__LEFT_HAND_SIDE:
 				return getLeftHandSide();
 			case AstPackage.EQUATION__RIGHT_HAND_SIDE:
@@ -196,6 +240,9 @@ public class EquationImpl extends MinimalEObjectImpl.Container implements Equati
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
+			case AstPackage.EQUATION__INITIAL:
+				setInitial((Boolean)newValue);
+				return;
 			case AstPackage.EQUATION__LEFT_HAND_SIDE:
 				setLeftHandSide((Expression)newValue);
 				return;
@@ -214,6 +261,9 @@ public class EquationImpl extends MinimalEObjectImpl.Container implements Equati
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
+			case AstPackage.EQUATION__INITIAL:
+				setInitial(INITIAL_EDEFAULT);
+				return;
 			case AstPackage.EQUATION__LEFT_HAND_SIDE:
 				setLeftHandSide((Expression)null);
 				return;
@@ -232,6 +282,8 @@ public class EquationImpl extends MinimalEObjectImpl.Container implements Equati
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
+			case AstPackage.EQUATION__INITIAL:
+				return initial != INITIAL_EDEFAULT;
 			case AstPackage.EQUATION__LEFT_HAND_SIDE:
 				return leftHandSide != null;
 			case AstPackage.EQUATION__RIGHT_HAND_SIDE:
@@ -240,4 +292,20 @@ public class EquationImpl extends MinimalEObjectImpl.Container implements Equati
 		return super.eIsSet(featureID);
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (initial: ");
+		result.append(initial);
+		result.append(')');
+		return result.toString();
+	}
+
 } //EquationImpl

+ 0 - 4
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/ForStatementImpl.java

@@ -8,17 +8,13 @@ package org.eclipselabs.mscript.language.ast.impl;
 
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
-
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
-
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
-
 import org.eclipselabs.mscript.language.ast.AstPackage;
 import org.eclipselabs.mscript.language.ast.ForStatement;
 import org.eclipselabs.mscript.language.ast.IterationVariable;
 import org.eclipselabs.mscript.language.ast.Statement;
-
 import org.eclipselabs.mscript.typesystem.Expression;
 
 /**

+ 24 - 23
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/FunctionDefinitionImpl.java

@@ -22,6 +22,7 @@ import org.eclipselabs.mscript.language.ast.AstPackage;
 import org.eclipselabs.mscript.language.ast.Check;
 import org.eclipselabs.mscript.language.ast.Equation;
 import org.eclipselabs.mscript.language.ast.FunctionDefinition;
+import org.eclipselabs.mscript.language.ast.FunctionKind;
 import org.eclipselabs.mscript.language.ast.FunctionObjectDeclaration;
 import org.eclipselabs.mscript.language.ast.InputParameterDeclaration;
 import org.eclipselabs.mscript.language.ast.OutputParameterDeclaration;
@@ -35,7 +36,7 @@ import org.eclipselabs.mscript.language.ast.TemplateParameterDeclaration;
  * <p>
  * The following features are implemented:
  * <ul>
- *   <li>{@link org.eclipselabs.mscript.language.ast.impl.FunctionDefinitionImpl#isStateful <em>Stateful</em>}</li>
+ *   <li>{@link org.eclipselabs.mscript.language.ast.impl.FunctionDefinitionImpl#getKind <em>Kind</em>}</li>
  *   <li>{@link org.eclipselabs.mscript.language.ast.impl.FunctionDefinitionImpl#getTemplateParameterDeclarations <em>Template Parameter Declarations</em>}</li>
  *   <li>{@link org.eclipselabs.mscript.language.ast.impl.FunctionDefinitionImpl#getInputParameterDeclarations <em>Input Parameter Declarations</em>}</li>
  *   <li>{@link org.eclipselabs.mscript.language.ast.impl.FunctionDefinitionImpl#getOutputParameterDeclarations <em>Output Parameter Declarations</em>}</li>
@@ -51,24 +52,24 @@ import org.eclipselabs.mscript.language.ast.TemplateParameterDeclaration;
  */
 public class FunctionDefinitionImpl extends DefinitionImpl implements FunctionDefinition {
 	/**
-	 * The default value of the '{@link #isStateful() <em>Stateful</em>}' attribute.
+	 * The default value of the '{@link #getKind() <em>Kind</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @see #isStateful()
+	 * @see #getKind()
 	 * @generated
 	 * @ordered
 	 */
-	protected static final boolean STATEFUL_EDEFAULT = false;
+	protected static final FunctionKind KIND_EDEFAULT = FunctionKind.STATELESS;
 
 	/**
-	 * The cached value of the '{@link #isStateful() <em>Stateful</em>}' attribute.
+	 * The cached value of the '{@link #getKind() <em>Kind</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @see #isStateful()
+	 * @see #getKind()
 	 * @generated
 	 * @ordered
 	 */
-	protected boolean stateful = STATEFUL_EDEFAULT;
+	protected FunctionKind kind = KIND_EDEFAULT;
 
 	/**
 	 * The cached value of the '{@link #getTemplateParameterDeclarations() <em>Template Parameter Declarations</em>}' containment reference list.
@@ -174,8 +175,8 @@ public class FunctionDefinitionImpl extends DefinitionImpl implements FunctionDe
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean isStateful() {
-		return stateful;
+	public FunctionKind getKind() {
+		return kind;
 	}
 
 	/**
@@ -183,11 +184,11 @@ public class FunctionDefinitionImpl extends DefinitionImpl implements FunctionDe
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public void setStateful(boolean newStateful) {
-		boolean oldStateful = stateful;
-		stateful = newStateful;
+	public void setKind(FunctionKind newKind) {
+		FunctionKind oldKind = kind;
+		kind = newKind == null ? KIND_EDEFAULT : newKind;
 		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, AstPackage.FUNCTION_DEFINITION__STATEFUL, oldStateful, stateful));
+			eNotify(new ENotificationImpl(this, Notification.SET, AstPackage.FUNCTION_DEFINITION__KIND, oldKind, kind));
 	}
 
 	/**
@@ -348,8 +349,8 @@ public class FunctionDefinitionImpl extends DefinitionImpl implements FunctionDe
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case AstPackage.FUNCTION_DEFINITION__STATEFUL:
-				return isStateful();
+			case AstPackage.FUNCTION_DEFINITION__KIND:
+				return getKind();
 			case AstPackage.FUNCTION_DEFINITION__TEMPLATE_PARAMETER_DECLARATIONS:
 				return getTemplateParameterDeclarations();
 			case AstPackage.FUNCTION_DEFINITION__INPUT_PARAMETER_DECLARATIONS:
@@ -379,8 +380,8 @@ public class FunctionDefinitionImpl extends DefinitionImpl implements FunctionDe
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case AstPackage.FUNCTION_DEFINITION__STATEFUL:
-				setStateful((Boolean)newValue);
+			case AstPackage.FUNCTION_DEFINITION__KIND:
+				setKind((FunctionKind)newValue);
 				return;
 			case AstPackage.FUNCTION_DEFINITION__TEMPLATE_PARAMETER_DECLARATIONS:
 				getTemplateParameterDeclarations().clear();
@@ -426,8 +427,8 @@ public class FunctionDefinitionImpl extends DefinitionImpl implements FunctionDe
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case AstPackage.FUNCTION_DEFINITION__STATEFUL:
-				setStateful(STATEFUL_EDEFAULT);
+			case AstPackage.FUNCTION_DEFINITION__KIND:
+				setKind(KIND_EDEFAULT);
 				return;
 			case AstPackage.FUNCTION_DEFINITION__TEMPLATE_PARAMETER_DECLARATIONS:
 				getTemplateParameterDeclarations().clear();
@@ -465,8 +466,8 @@ public class FunctionDefinitionImpl extends DefinitionImpl implements FunctionDe
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case AstPackage.FUNCTION_DEFINITION__STATEFUL:
-				return stateful != STATEFUL_EDEFAULT;
+			case AstPackage.FUNCTION_DEFINITION__KIND:
+				return kind != KIND_EDEFAULT;
 			case AstPackage.FUNCTION_DEFINITION__TEMPLATE_PARAMETER_DECLARATIONS:
 				return templateParameterDeclarations != null && !templateParameterDeclarations.isEmpty();
 			case AstPackage.FUNCTION_DEFINITION__INPUT_PARAMETER_DECLARATIONS:
@@ -497,8 +498,8 @@ public class FunctionDefinitionImpl extends DefinitionImpl implements FunctionDe
 		if (eIsProxy()) return super.toString();
 
 		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (stateful: ");
-		result.append(stateful);
+		result.append(" (kind: ");
+		result.append(kind);
 		result.append(')');
 		return result.toString();
 	}

+ 0 - 4
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/IfStatementImpl.java

@@ -8,16 +8,12 @@ package org.eclipselabs.mscript.language.ast.impl;
 
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
-
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
-
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
-
 import org.eclipselabs.mscript.language.ast.AstPackage;
 import org.eclipselabs.mscript.language.ast.IfStatement;
 import org.eclipselabs.mscript.language.ast.Statement;
-
 import org.eclipselabs.mscript.typesystem.Expression;
 
 /**

+ 0 - 4
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/ReturnStatementImpl.java

@@ -8,15 +8,11 @@ package org.eclipselabs.mscript.language.ast.impl;
 
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
-
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
-
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
-
 import org.eclipselabs.mscript.language.ast.AstPackage;
 import org.eclipselabs.mscript.language.ast.ReturnStatement;
-
 import org.eclipselabs.mscript.typesystem.Expression;
 
 /**

+ 0 - 4
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/VariableDeclarationImpl.java

@@ -8,15 +8,11 @@ package org.eclipselabs.mscript.language.ast.impl;
 
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
-
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
-
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
-
 import org.eclipselabs.mscript.language.ast.AstPackage;
 import org.eclipselabs.mscript.language.ast.VariableDeclaration;
-
 import org.eclipselabs.mscript.typesystem.Expression;
 
 /**

+ 0 - 4
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/WhileStatementImpl.java

@@ -8,16 +8,12 @@ package org.eclipselabs.mscript.language.ast.impl;
 
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
-
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
-
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
-
 import org.eclipselabs.mscript.language.ast.AstPackage;
 import org.eclipselabs.mscript.language.ast.Statement;
 import org.eclipselabs.mscript.language.ast.WhileStatement;
-
 import org.eclipselabs.mscript.typesystem.Expression;
 
 /**

+ 27 - 1
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/util/AstAdapterFactory.java

@@ -10,7 +10,6 @@ import org.eclipse.emf.common.notify.Adapter;
 import org.eclipse.emf.common.notify.Notifier;
 import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
 import org.eclipse.emf.ecore.EObject;
-import org.eclipselabs.mscript.language.ast.*;
 import org.eclipselabs.mscript.language.ast.AdditiveExpression;
 import org.eclipselabs.mscript.language.ast.AdditiveStepExpression;
 import org.eclipselabs.mscript.language.ast.AlgorithmExpression;
@@ -22,15 +21,19 @@ import org.eclipselabs.mscript.language.ast.ArraySubscript;
 import org.eclipselabs.mscript.language.ast.Assertion;
 import org.eclipselabs.mscript.language.ast.Assignment;
 import org.eclipselabs.mscript.language.ast.AstPackage;
+import org.eclipselabs.mscript.language.ast.BreakStatement;
 import org.eclipselabs.mscript.language.ast.BuiltinDefinition;
 import org.eclipselabs.mscript.language.ast.BuiltinFunction;
 import org.eclipselabs.mscript.language.ast.BuiltinVariable;
 import org.eclipselabs.mscript.language.ast.CallableElement;
 import org.eclipselabs.mscript.language.ast.Check;
 import org.eclipselabs.mscript.language.ast.Compound;
+import org.eclipselabs.mscript.language.ast.ContinueStatement;
 import org.eclipselabs.mscript.language.ast.DataTypeDefinition;
 import org.eclipselabs.mscript.language.ast.DataTypeSpecifier;
 import org.eclipselabs.mscript.language.ast.Definition;
+import org.eclipselabs.mscript.language.ast.DerivativeOperator;
+import org.eclipselabs.mscript.language.ast.DoWhileStatement;
 import org.eclipselabs.mscript.language.ast.EndExpression;
 import org.eclipselabs.mscript.language.ast.EnumerationDefinition;
 import org.eclipselabs.mscript.language.ast.EnumerationLiteralDeclaration;
@@ -38,10 +41,12 @@ import org.eclipselabs.mscript.language.ast.EqualityExpression;
 import org.eclipselabs.mscript.language.ast.Equation;
 import org.eclipselabs.mscript.language.ast.ExpressionList;
 import org.eclipselabs.mscript.language.ast.FeatureCall;
+import org.eclipselabs.mscript.language.ast.ForStatement;
 import org.eclipselabs.mscript.language.ast.FunctionCall;
 import org.eclipselabs.mscript.language.ast.FunctionDefinition;
 import org.eclipselabs.mscript.language.ast.FunctionObjectDeclaration;
 import org.eclipselabs.mscript.language.ast.IfExpression;
+import org.eclipselabs.mscript.language.ast.IfStatement;
 import org.eclipselabs.mscript.language.ast.ImpliesExpression;
 import org.eclipselabs.mscript.language.ast.InputParameterDeclaration;
 import org.eclipselabs.mscript.language.ast.IterationAccumulator;
@@ -67,6 +72,7 @@ import org.eclipselabs.mscript.language.ast.RangeStepExpression;
 import org.eclipselabs.mscript.language.ast.RecordDefinition;
 import org.eclipselabs.mscript.language.ast.RecordFieldDeclaration;
 import org.eclipselabs.mscript.language.ast.RelationalExpression;
+import org.eclipselabs.mscript.language.ast.ReturnStatement;
 import org.eclipselabs.mscript.language.ast.StateVariableDeclaration;
 import org.eclipselabs.mscript.language.ast.Statement;
 import org.eclipselabs.mscript.language.ast.StepExpression;
@@ -80,6 +86,8 @@ import org.eclipselabs.mscript.language.ast.TypeTestExpression;
 import org.eclipselabs.mscript.language.ast.UnaryExpression;
 import org.eclipselabs.mscript.language.ast.UnitConstructionOperator;
 import org.eclipselabs.mscript.language.ast.VariableAccess;
+import org.eclipselabs.mscript.language.ast.VariableDeclaration;
+import org.eclipselabs.mscript.language.ast.WhileStatement;
 import org.eclipselabs.mscript.typesystem.Expression;
 
 /**
@@ -263,6 +271,10 @@ public class AstAdapterFactory extends AdapterFactoryImpl {
 				return createIterationAccumulatorAdapter();
 			}
 			@Override
+			public Adapter caseDerivativeOperator(DerivativeOperator object) {
+				return createDerivativeOperatorAdapter();
+			}
+			@Override
 			public Adapter caseArrayConstructionOperator(ArrayConstructionOperator object) {
 				return createArrayConstructionOperatorAdapter();
 			}
@@ -914,6 +926,20 @@ public class AstAdapterFactory extends AdapterFactoryImpl {
 		return null;
 	}
 
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipselabs.mscript.language.ast.DerivativeOperator <em>Derivative Operator</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipselabs.mscript.language.ast.DerivativeOperator
+	 * @generated
+	 */
+	public Adapter createDerivativeOperatorAdapter() {
+		return null;
+	}
+
 	/**
 	 * Creates a new adapter for an object of class '{@link org.eclipselabs.mscript.language.ast.ArrayConstructionOperator <em>Array Construction Operator</em>}'.
 	 * <!-- begin-user-doc -->

+ 31 - 1
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/util/AstSwitch.java

@@ -9,7 +9,6 @@ package org.eclipselabs.mscript.language.ast.util;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.emf.ecore.util.Switch;
-import org.eclipselabs.mscript.language.ast.*;
 import org.eclipselabs.mscript.language.ast.AdditiveExpression;
 import org.eclipselabs.mscript.language.ast.AdditiveStepExpression;
 import org.eclipselabs.mscript.language.ast.AlgorithmExpression;
@@ -21,15 +20,19 @@ import org.eclipselabs.mscript.language.ast.ArraySubscript;
 import org.eclipselabs.mscript.language.ast.Assertion;
 import org.eclipselabs.mscript.language.ast.Assignment;
 import org.eclipselabs.mscript.language.ast.AstPackage;
+import org.eclipselabs.mscript.language.ast.BreakStatement;
 import org.eclipselabs.mscript.language.ast.BuiltinDefinition;
 import org.eclipselabs.mscript.language.ast.BuiltinFunction;
 import org.eclipselabs.mscript.language.ast.BuiltinVariable;
 import org.eclipselabs.mscript.language.ast.CallableElement;
 import org.eclipselabs.mscript.language.ast.Check;
 import org.eclipselabs.mscript.language.ast.Compound;
+import org.eclipselabs.mscript.language.ast.ContinueStatement;
 import org.eclipselabs.mscript.language.ast.DataTypeDefinition;
 import org.eclipselabs.mscript.language.ast.DataTypeSpecifier;
 import org.eclipselabs.mscript.language.ast.Definition;
+import org.eclipselabs.mscript.language.ast.DerivativeOperator;
+import org.eclipselabs.mscript.language.ast.DoWhileStatement;
 import org.eclipselabs.mscript.language.ast.EndExpression;
 import org.eclipselabs.mscript.language.ast.EnumerationDefinition;
 import org.eclipselabs.mscript.language.ast.EnumerationLiteralDeclaration;
@@ -37,10 +40,12 @@ import org.eclipselabs.mscript.language.ast.EqualityExpression;
 import org.eclipselabs.mscript.language.ast.Equation;
 import org.eclipselabs.mscript.language.ast.ExpressionList;
 import org.eclipselabs.mscript.language.ast.FeatureCall;
+import org.eclipselabs.mscript.language.ast.ForStatement;
 import org.eclipselabs.mscript.language.ast.FunctionCall;
 import org.eclipselabs.mscript.language.ast.FunctionDefinition;
 import org.eclipselabs.mscript.language.ast.FunctionObjectDeclaration;
 import org.eclipselabs.mscript.language.ast.IfExpression;
+import org.eclipselabs.mscript.language.ast.IfStatement;
 import org.eclipselabs.mscript.language.ast.ImpliesExpression;
 import org.eclipselabs.mscript.language.ast.InputParameterDeclaration;
 import org.eclipselabs.mscript.language.ast.IterationAccumulator;
@@ -66,6 +71,7 @@ import org.eclipselabs.mscript.language.ast.RangeStepExpression;
 import org.eclipselabs.mscript.language.ast.RecordDefinition;
 import org.eclipselabs.mscript.language.ast.RecordFieldDeclaration;
 import org.eclipselabs.mscript.language.ast.RelationalExpression;
+import org.eclipselabs.mscript.language.ast.ReturnStatement;
 import org.eclipselabs.mscript.language.ast.StateVariableDeclaration;
 import org.eclipselabs.mscript.language.ast.Statement;
 import org.eclipselabs.mscript.language.ast.StepExpression;
@@ -79,6 +85,8 @@ import org.eclipselabs.mscript.language.ast.TypeTestExpression;
 import org.eclipselabs.mscript.language.ast.UnaryExpression;
 import org.eclipselabs.mscript.language.ast.UnitConstructionOperator;
 import org.eclipselabs.mscript.language.ast.VariableAccess;
+import org.eclipselabs.mscript.language.ast.VariableDeclaration;
+import org.eclipselabs.mscript.language.ast.WhileStatement;
 import org.eclipselabs.mscript.typesystem.Expression;
 
 /**
@@ -350,6 +358,13 @@ public class AstSwitch<T> extends Switch<T> {
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
+			case AstPackage.DERIVATIVE_OPERATOR: {
+				DerivativeOperator derivativeOperator = (DerivativeOperator)theEObject;
+				T result = caseDerivativeOperator(derivativeOperator);
+				if (result == null) result = caseExpression(derivativeOperator);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
 			case AstPackage.ARRAY_CONSTRUCTION_OPERATOR: {
 				ArrayConstructionOperator arrayConstructionOperator = (ArrayConstructionOperator)theEObject;
 				T result = caseArrayConstructionOperator(arrayConstructionOperator);
@@ -1154,6 +1169,21 @@ public class AstSwitch<T> extends Switch<T> {
 		return null;
 	}
 
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Derivative Operator</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Derivative Operator</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseDerivativeOperator(DerivativeOperator object) {
+		return null;
+	}
+
 	/**
 	 * Returns the result of interpreting the object as an instance of '<em>Array Construction Operator</em>'.
 	 * <!-- begin-user-doc -->

+ 9 - 3
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/functionmodel/construct/FunctionDescriptorConstructor.java

@@ -154,9 +154,15 @@ public class FunctionDescriptorConstructor implements IFunctionDescriptorConstru
 			case INPUT_PARAMETER:
 			case OUTPUT_PARAMETER:
 			case STATE_VARIABLE:
-				if (variableAccess.getStepExpression() != null
-						&& !equationSide.getDescriptor().getFunctionDescriptor().getDefinition().isStateful()) {
-					message = "Variable references of stateless functions must not specify step expressions";
+				if (variableAccess.getStepExpression() != null) {
+					switch (equationSide.getDescriptor().getFunctionDescriptor().getDefinition().getKind()) {
+					case STATELESS:
+						message = "Variable references of stateless functions must not specify step expressions";
+						break;
+					case CONTINUOUS:
+						message = "Variable references of continuous functions must not specify step expressions";
+						break;
+					}
 				}
 				break;
 			}

+ 2 - 1
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/il/transform/FunctionDefinitionTransformer.java

@@ -25,6 +25,7 @@ import org.eclipse.core.runtime.MultiStatus;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipselabs.mscript.computation.core.value.IValue;
+import org.eclipselabs.mscript.language.ast.FunctionKind;
 import org.eclipselabs.mscript.language.ast.ParameterDeclaration;
 import org.eclipselabs.mscript.language.ast.StateVariableDeclaration;
 import org.eclipselabs.mscript.language.functionmodel.EquationDescriptor;
@@ -63,7 +64,7 @@ public class FunctionDefinitionTransformer implements IFunctionDefinitionTransfo
 		MultiStatus status = new MultiStatus(LanguagePlugin.PLUGIN_ID, 0, "Function definition transformation errors", null);
 
 		ILFunctionDefinition ilFunctionDefinition = ILFactory.eINSTANCE.createILFunctionDefinition();
-		ilFunctionDefinition.setStateful(functionDescriptor.getDefinition().isStateful());
+		ilFunctionDefinition.setStateful(functionDescriptor.getDefinition().getKind() == FunctionKind.STATEFUL);
 		ilFunctionDefinition.setName(functionName != null ? functionName : functionDescriptor.getDefinition().getName());
 		
 		Map<VariableDescriptor, VariableDeclaration> variableDeclarations = new HashMap<VariableDescriptor, VariableDeclaration>();

+ 3 - 2
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/validation/MscriptJavaValidator.java

@@ -24,6 +24,7 @@ import org.eclipselabs.mscript.language.ast.DataTypeSpecifier;
 import org.eclipselabs.mscript.language.ast.EndExpression;
 import org.eclipselabs.mscript.language.ast.FunctionCall;
 import org.eclipselabs.mscript.language.ast.FunctionDefinition;
+import org.eclipselabs.mscript.language.ast.FunctionKind;
 import org.eclipselabs.mscript.language.ast.FunctionObjectDeclaration;
 import org.eclipselabs.mscript.language.ast.InputParameterDeclaration;
 import org.eclipselabs.mscript.language.ast.IterationAccumulator;
@@ -57,9 +58,9 @@ public class MscriptJavaValidator extends AbstractMscriptJavaValidator {
 
 	@Check
 	public void checkStatelessFunction(FunctionDefinition functionDefinition) {
-		if (!functionDefinition.isStateful()) {
+		if (functionDefinition.getKind() == FunctionKind.STATELESS) {
 			for (StateVariableDeclaration stateVariableDeclaration : functionDefinition.getStateVariableDeclarations()) {
-				error("The state variable " + stateVariableDeclaration.getName() + " can only be declared in a stateful function", stateVariableDeclaration, null, -1);
+				error("The state variable " + stateVariableDeclaration.getName() + " can only be declared in stateful or continuous functions", stateVariableDeclaration, null, -1);
 			}
 		}
 	}