public static bool TryReadLValue(this Scanner scanner, out ILValue result) { string identifier; if (scanner.TryReadToken(Token.Identifier, out identifier)) { if (scanner.CurrentToken == Token.LParen) { throw new ParserException(ErrorMessages.MissingLValue); } if (scanner.TryReadToken(Token.LBracket)) { var indexes = scanner.ReadExpressions(); scanner.ReadToken(Token.RBracket); result = new ArrayVariable(identifier, indexes); return(true); } result = new ScalarVariable(identifier); return(true); } result = null; return(false); }
public void Execute_OfInput_StoresValueFromInput() { var inputOutput = MakeInputOutput("12345"); var rte = MakeRunTimeEnvironment(inputOutput); var i = new ScalarVariable("I"); var input = new Input(i); input.Execute(rte); var actual = rte.Variables["I"]; Assert.AreEqual(12345, actual); }
public void Execute_OfForNext_RepeatsInnerStatement() { var rte = MakeRunTimeEnvironment(); var i = new ScalarVariable("I"); var from = new Constant(1); var to = new Constant(10); var step = new Constant(1); var shoudBeEqualTo50 = 0; var forNext = new ForNext(i, from, to, step, MakeStatement(() => { shoudBeEqualTo50 += 5; })); forNext.Execute(rte); Assert.AreEqual(50, shoudBeEqualTo50); }
public void Execute_OfFor_RepeatsInnerStatement() { var rte = MakeRunTimeEnvironment(); var i = new ScalarVariable("I"); var from = new Constant(1); var to = new Constant(10); var shoudBeEqualTo50 = 0; rte.AddOrUpdate(new Line("20", new For(i, from, to, new Constant(1)))); rte.AddOrUpdate(new Line("30", MakeStatement(() => { shoudBeEqualTo50 += 5; }))); rte.AddOrUpdate(new Line("40", new Next())); rte.Run(); Assert.AreEqual(50, shoudBeEqualTo50); }
private static bool TryReadArrayFunctionOrScalar(this Scanner scanner, out IExpression expression) { if (scanner.TryReadToken(Token.Identifier, out string text)) { if (scanner.TryReadToken(Token.LBracket)) { var parameters = scanner.ReadExpressions(); scanner.ReadToken(Token.RBracket); expression = new ArrayVariable(text, parameters); return(true); } if (scanner.TryReadToken(Token.LParen)) { IReadOnlyList <IExpression> parameters; if (scanner.TryReadToken(Token.RParen)) { parameters = new IExpression[0]; } else { parameters = scanner.ReadExpressions(); scanner.ReadToken(Token.RParen); } if (string.Equals("RND", text, StringComparison.OrdinalIgnoreCase)) { expression = new Rnd(parameters); } else { expression = new Function(text, parameters); } return(true); } expression = new ScalarVariable(text); return(true); } expression = null; return(false); }
public static FMUData ImportFMU(string vehicleName) { FMUData data = null; string[] filters = { "FMUs", "fmu", "All files", "*" }; string fmuPath = EditorUtility.OpenFilePanelWithFilters("Import FMU", "", filters); if (!string.IsNullOrEmpty(fmuPath)) { data = new FMUData(); var fmuName = Path.GetFileNameWithoutExtension(fmuPath); var unzipDir = Path.Combine(Application.dataPath, "External", "Vehicles", vehicleName, fmuName); ZipFile zip = new ZipFile(fmuPath); ExtractZipFile(fmuPath, unzipDir); XDocument doc = XDocument.Load(unzipDir + "/modelDescription.xml"); if (doc != null) { var root = doc.Root; data.Version = (string)root.Attribute("fmiVersion"); data.GUID = (string)root.Attribute("guid"); data.modelName = (string)root.Attribute("modelName"); // TODO support multiple modelIdentifiers ME or CS data.type = FMIType.ModelExchange; foreach (var e in root.Elements("CoSimulation")) { data.type = FMIType.CoSimulation; } var variables = new List <ScalarVariable>(); foreach (var e in root.Element("ModelVariables").Elements("ScalarVariable")) { var v = new ScalarVariable { name = (string)e.Attribute("name"), description = (string)e.Attribute("description"), causality = (string)e.Attribute("causality"), variability = (string)e.Attribute("variability"), initial = (string)e.Attribute("initial"), valueReference = (uint)e.Attribute("valueReference"), }; variables.Add(v); foreach (var el in e.Elements("Real")) { v.type = VariableType.Real; v.start = (string)el.Attribute("start"); } foreach (var el in e.Elements("Integer")) { v.type = VariableType.Integer; v.start = (string)el.Attribute("start"); } foreach (var el in e.Elements("Boolean")) { v.type = VariableType.Boolean; v.start = (string)el.Attribute("start"); } foreach (var el in e.Elements("String")) { v.type = VariableType.String; v.start = (string)el.Attribute("start"); } } data.modelVariables = variables; data.Name = fmuName; AssetDatabase.Refresh(); } } return(data); }
public static void ImportFMU() { string[] filters = { "FMUs", "fmu", "All files", "*" }; string fmuPath = EditorUtility.OpenFilePanelWithFilters("Import FMU", "", filters); if (string.IsNullOrEmpty(fmuPath)) { return; } var fmuName = Path.GetFileNameWithoutExtension(fmuPath); var unzipdir = Path.Combine(Application.streamingAssetsPath, fmuName); var zip = ZipFile.Read(fmuPath); zip.ExtractExistingFile = ExtractExistingFileAction.OverwriteSilently; zip.ExtractAll(unzipdir); var modelDescription = ScriptableObject.CreateInstance <ModelDescription>(); XDocument doc = XDocument.Load(unzipdir + "/modelDescription.xml"); var root = doc.Root; modelDescription.fmiVersion = (string)root.Attribute("fmiVersion"); modelDescription.guid = ((string)root.Attribute("guid")).ToCharArray(); modelDescription.modelName = (string)root.Attribute("modelName"); foreach (var e in root.Elements("CoSimulation")) { modelDescription.coSimulation = new Implementation(); modelDescription.coSimulation.modelIdentifier = (string)e.Attribute("modelIdentifier"); } var variables = new List <ScalarVariable>(); foreach (var e in root.Element("ModelVariables").Elements("ScalarVariable")) { var v = new ScalarVariable { name = (string)e.Attribute("name"), description = (string)e.Attribute("description"), causality = (string)e.Attribute("causality"), variability = (string)e.Attribute("variability"), initial = (string)e.Attribute("initial"), valueReference = (uint)e.Attribute("valueReference"), }; variables.Add(v); foreach (var el in e.Elements("Real")) { v.type = VariableType.Real; v.start = (string)el.Attribute("start"); } foreach (var el in e.Elements("Integer")) { v.type = VariableType.Integer; v.start = (string)el.Attribute("start"); } foreach (var el in e.Elements("Boolean")) { v.type = VariableType.Boolean; v.start = (string)el.Attribute("start"); } foreach (var el in e.Elements("String")) { v.type = VariableType.String; v.start = (string)el.Attribute("start"); } } modelDescription.modelVariables = variables.ToArray(); AssetDatabase.CreateAsset(modelDescription, "Assets/Resources/" + fmuName + ".asset"); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); EditorUtility.FocusProjectWindow(); Selection.activeObject = modelDescription; }