public void Translate(ActionSet actionSet) { if (DefinedVariable != null) { // Add the defined variable to the index assigner. actionSet.IndexAssigner.Add(actionSet.VarCollection, DefinedVariable, actionSet.IsGlobal, null); // Set the initial variable. if (actionSet.IndexAssigner[DefinedVariable] is IndexReference && DefinedVariable.InitialValue != null) { actionSet.AddAction(((IndexReference)actionSet.IndexAssigner[DefinedVariable]).SetVariable( (Element)DefinedVariable.InitialValue.Parse(actionSet) )); } } else if (InitialVarSet != null) { InitialVarSet.Translate(actionSet); } WhileBuilder whileBuilder = new WhileBuilder(actionSet, Condition?.Parse(actionSet)); whileBuilder.Setup(); Block.Translate(actionSet); if (SetVariableAction != null) { SetVariableAction.Translate(actionSet); } whileBuilder.Finish(); }
public ForAction(ParseInfo parseInfo, Scope scope, DeltinScriptParser.ForContext forContext) { Scope varScope = scope.Child(); if (forContext.define() != null) { DefinedVariable = new ScopedVariable(varScope, new DefineContextHandler(parseInfo, forContext.define())); } else if (forContext.initialVarset != null) { InitialVarSet = new SetVariableAction(parseInfo, varScope, forContext.initialVarset); } if (forContext.expr() != null) { Condition = DeltinScript.GetExpression(parseInfo, varScope, forContext.expr()); } if (forContext.endingVarset != null) { SetVariableAction = new SetVariableAction(parseInfo, varScope, forContext.endingVarset); } // Get the block. if (forContext.block() != null) { Block = new BlockAction(parseInfo.SetLoop(this), varScope, forContext.block()); // Get the path info. Path = new PathInfo(Block, DocRange.GetRange(forContext.FOR()), false); } else { parseInfo.Script.Diagnostics.Error("Expected a block.", DocRange.GetRange(forContext.RIGHT_PAREN())); } }
public void Translate(ActionSet actionSet) { VariableElements elements = _resolve.ParseElements(actionSet); // Increment if (!_decrement) { actionSet.AddAction(SetVariableAction.CommentAll(_comment, elements.IndexReference.ModifyVariable(Operation.Add, 1, elements.Target, elements.Index))); } // Decrement else { actionSet.AddAction(SetVariableAction.CommentAll(_comment, elements.IndexReference.ModifyVariable(Operation.Subtract, 1, elements.Target, elements.Index))); } }
public override void Translate(ActionSet actionSet) { if (DefinedVariable != null) { // Add the defined variable to the index assigner. actionSet.IndexAssigner.Add(actionSet.VarCollection, DefinedVariable, actionSet.IsGlobal, null); // Set the initial variable. if (actionSet.IndexAssigner[DefinedVariable] is IndexReference && DefinedVariable.InitialValue != null) { actionSet.AddAction(((IndexReference)actionSet.IndexAssigner[DefinedVariable]).SetVariable( (Element)DefinedVariable.InitialValue.Parse(actionSet) )); } } else if (InitialVarSet != null) { InitialVarSet.Translate(actionSet); } // Get the condition. Element condition; if (Condition != null) { condition = (Element)Condition.Parse(actionSet); // User-define condition } else { condition = new V_True(); // No condition, just use true. } actionSet.AddAction(Element.Part <A_While>(condition)); Block.Translate(actionSet.Indent()); // Resolve continues. ResolveContinues(actionSet); if (SetVariableAction != null) { SetVariableAction.Translate(actionSet.Indent()); } actionSet.AddAction(new A_End()); // Resolve breaks. ResolveBreaks(actionSet); }
public ForAction(ParseInfo parseInfo, Scope scope, For forContext) { Scope varScope = scope.Child(); IsAutoFor = forContext.Iterator is ExpressionStatement; // Get the initializer. if (!IsAutoFor) { // Normal for loop initializer. if (forContext.Initializer != null) { // Declaration for initializer. if (forContext.Initializer is VariableDeclaration declaration) { DefinedVariable = new ScopedVariable(varScope, new DefineContextHandler(parseInfo, declaration)); } // Variable assignment for initializer else if (forContext.Initializer is Assignment assignment) { Initializer = new SetVariableAction(parseInfo, varScope, assignment); } // TODO: Throw error on incorrect initializer type. } } else { // Auto-for initializer. // Missing initializer. if (forContext.Initializer == null) { // Error if there is no initializer. if (forContext.InitializerSemicolon) { parseInfo.Script.Diagnostics.Error("Auto-for loops require an initializer.", forContext.InitializerSemicolon.Range); } } // Declaration else if (forContext.Initializer is VariableDeclaration declaration) { DefinedVariable = new ScopedVariable(varScope, new DefineContextHandler(parseInfo, declaration)); } // Assignment else if (forContext.Initializer is Assignment assignment) { // Get the variable being set. VariableResolve = new VariableResolve(new VariableResolveOptions() { // The for cannot be indexed and should be on the rule-level. CanBeIndexed = false, FullVariable = true }, parseInfo.GetExpression(varScope, assignment.VariableExpression), assignment.VariableExpression.Range, parseInfo.Script.Diagnostics); InitialResolveValue = parseInfo.GetExpression(scope, assignment.Value); } // Variable else if (forContext.Initializer is ExpressionStatement exprStatement && exprStatement.Expression is Identifier identifier) { // The variable is defined but no start value was given. In this case, just start at 0. // Get the variable. VariableResolve = new VariableResolve(new VariableResolveOptions() { // The for cannot be indexed and should be on the rule-level. CanBeIndexed = false, FullVariable = true }, parseInfo.GetExpression(varScope, identifier), identifier.Range, parseInfo.Script.Diagnostics); }