private void CheckVariablesUsage() { LexicalAnalyzer lexAnalyzer = new LexicalAnalyzer(); SyntaxAnalyzer syntaxAnalyzer; foreach (Transition trans in TransitionsList) { if (trans is SimpleTransition strans) { lexAnalyzer.Source = strans.Condition; syntaxAnalyzer = new SyntaxAnalyzer(lexAnalyzer, VariableCollection.GetConditionDictionary(trans.OwnerDraw.OwnerSheet).Keys.ToList()); foreach (SyntaxToken token in syntaxAnalyzer.Tokens) { if (token.Qualifier != SyntaxToken.Qualifiers.Correct) { MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, string.Format("{0}: {1}.", trans.Name, token.ToString()), trans)); } } foreach (string outputOperation in strans.OutputsList) { string outputName = LexicalRules.GetOutputId(outputOperation); if (!trans.OwnerDraw.OwnerSheet.Variables.InternalOutputs.Exists(output => output.Name == outputName)) { MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "Output " + outputName + " is not defined in variables list.", trans)); } } } } foreach (DrawableObject obj in ObjectsTable) { if (obj is State state) { //state.EnterOutputsList.RemoveAll(str => !state.OwnerDraw.OwnerSheet.Variables.InternalOutputs.Exists(var => var.Name == LexicalAnalyzer.GetId(str))); foreach (string outputOperation in state.EnterOutputsList) { string outputName = LexicalRules.GetOutputId(outputOperation); if (!state.OwnerDraw.OwnerSheet.Variables.InternalOutputs.Exists(var => var.Name == LexicalAnalyzer.GetId(outputName))) { MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "Output " + outputName + " is not defined in variables list.", state)); } } //state.ExitOutputsList.RemoveAll(str => !state.OwnerDraw.OwnerSheet.Variables.InternalOutputs.Exists(var => var.Name == LexicalAnalyzer.GetId(str))); foreach (string outputOperation in state.ExitOutputsList) { string outputName = LexicalRules.GetOutputId(outputOperation); if (!state.OwnerDraw.OwnerSheet.Variables.InternalOutputs.Exists(var => var.Name == LexicalAnalyzer.GetId(outputName))) { MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "Output " + outputName + " is not defined in variables list.", state)); } } } } }
public override object EditValue(ITypeDescriptorContext context, System.IServiceProvider provider, object value) { if (value == null) { throw new Exception("The property value must be different to null."); } var svc = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService; var codes = value as string; if (svc != null && codes != null) { DrawableObject obj = context.Instance as DrawableObject; DrawingSheet sheet = obj.OwnerDraw.OwnerSheet; using (var form = new EditCondition(VariableCollection.GetConditionDictionary(sheet), codes)) { if (svc.ShowDialog(form) == DialogResult.OK) { value = form.Condition; } } } return(value); }
private void GetUsedObjects(DrawingSheet sheet, VariableCollection variables) { if (sheet is ModelSheet model) { UsedModels.Add(model); } else { UsedSheets.Add(sheet); } foreach (DrawableObject obj in sheet.Sketch.Objects) { if (obj is Relation indir) { Variable input = VariableCollection.GetIndirectInput(sheet, indir.Trigger); Variable output = VariableCollection.GetIndirectOutput(sheet, indir.Output); if (input == null) { MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "Relation trigger variable not found.", indir)); } if (output == null) { MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "Relation output variable not found.", indir)); } if (input != null && output != null) { BasicRelation ibindir = RelationsList.FirstOrDefault(ind => ind.Input.Name == input.Name); BasicRelation obindir = RelationsList.FirstOrDefault(ind => ind.Action.Output.Name == input.Name); if (ibindir != null) { MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "Relation has same input than other one.", indir, ibindir.Relation)); } if (obindir != null) { MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "Relation has same output than other one.", indir, obindir.Relation)); } if (ibindir == null && obindir == null) { BasicOutput action = indir.Action == null ? null : new BasicOutput((OperationType)Enum.Parse(typeof(OperationType), indir.Action), output); BasicRelation bindir = new BasicRelation(indir, input, action); RelationsList.Add(bindir); } } } else if (obj is Equation eq) { IInternalOutput output = variables.IndirectOutputs.FirstOrDefault(io => io.Name == eq.AssignTo); if (output == null) { MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "Relation trigger variable not found.", eq)); } if (eq.Operation == "") { MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "Equation does not have operation.", eq)); } LexicalAnalyzer lexAnalyzer = new LexicalAnalyzer(); SyntaxAnalyzer syntaxAnalyzer; lexAnalyzer.Source = eq.Operation; syntaxAnalyzer = new SyntaxAnalyzer(lexAnalyzer, VariableCollection.GetConditionDictionary(eq.OwnerDraw.OwnerSheet).Keys.ToList()); foreach (SyntaxToken token in syntaxAnalyzer.Tokens) { if (token.Qualifier != SyntaxToken.Qualifiers.Correct) { MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, string.Format("{0}: {1}.", eq.Name, token.ToString()), eq)); } } EquationsList.Add(new BasicEquation(eq)); } else if (obj is Transition trans) { TransitionsList.Add(trans); if (trans.StartObject == null) { MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "Transition without start connection.", trans)); } if (trans.EndObject == null) { MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "Transition without end connection.", trans)); } if (trans is SimpleTransition strans && strans.Condition == "" && strans.Timeout == 0) { if (strans.StartObject is Origin origin) { if (strans.EndObject is End || strans.EndObject is Abort) { MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "One shot machine Transition should have a condition.", trans)); } } else if (!strans.DefaultTransition) { MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "Transition does not have condition or timeout value.", trans)); } } else if (trans is SuperTransition sptrans && sptrans.Links == "") { MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "Transition is not linking any object.", trans)); } }