internal RightValue ParseValue(string value, DataType type, Location loc) { switch (type) { case DataType.Int: int intParsed; if (!int.TryParse(value, out intParsed)) { kernel.IssueError(ErrorType.ParseTypeError, loc, value, type.ToString()); return(null); } IntConst intResult = new IntConst(); intResult.Value = intParsed; return(intResult); case DataType.Float: float floatParsed; if (!float.TryParse(value, out floatParsed)) { kernel.IssueError(ErrorType.ParseTypeError, loc, value, type.ToString()); return(null); } FloatConst floatResult = new FloatConst(); floatResult.Value = floatParsed; return(floatResult); case DataType.Bool: bool boolParsed; int boolIntParsed; double boolFloatParsed; BoolConst boolResult = new BoolConst(); if (bool.TryParse(value, out boolParsed)) { boolResult.Value = boolParsed; return(boolResult); } else if (int.TryParse(value, out boolIntParsed)) { boolResult.Value = (boolIntParsed != 0); return(boolResult); } else if (double.TryParse(value, out boolFloatParsed)) { boolResult.Value = (boolFloatParsed != 0); return(boolResult); } else { kernel.IssueError(ErrorType.ParseTypeError, loc, value, type.ToString()); return(null); } case DataType.String: StringConst strConst = new StringConst(); strConst.Value = value; return(strConst); } return(null); }
public override void Visit(FireMLRoot root, object[] args) { if (root.MainPlot == null) { kernel.IssueError(ErrorType.MainPlotNotExist, new Location("")); } base.Visit(root, args); }
private bool checkSourceResult(AvailableCheckResult result, string source, string expectedType, Location location) { switch (result) { case AvailableCheckResult.Available: return(true); case AvailableCheckResult.NotExist: kernel.IssueError(ErrorType.SourceNotExist, location, source); return(false); case AvailableCheckResult.NotSupported: kernel.IssueError(ErrorType.SourceNotSupported, location, source); return(false); case AvailableCheckResult.TypeError: //TODO:类型检查 kernel.IssueError(ErrorType.SourceTypeError, location, expectedType, "TODO!"); return(false); default: throw new ArgumentOutOfRangeException(); } }
public void Build(string[] plotFiles, FireMLRoot root) { foreach (string file in plotFiles) { this.file = file; xmlError = false; //FINISH: 检查XML语法 XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Schemas = kernel.FireMLSchemaSet; try { xmlDoc.Load(file); } catch (Exception e) { kernel.IssueError(ErrorType.ReadFileError, e.Message, new Location(file)); continue; } xmlDoc.Validate(new ValidationEventHandler(settings_ValidationEventHandler)); if (xmlError) { continue; } XmlTextReader reader; try { reader = new XmlTextReader(file); } catch (Exception e) { kernel.IssueError(ErrorType.ReadFileError, e.Message, new Location(file)); continue; } for (; reader.Name != "FireML"; reader.Read()) { ; } reader.MoveToContent(); this.reader = reader; root.Accept(this); } }
/* #region IAssetVisitor Members * * /// <summary> * /// * /// </summary> * /// <param name="actorAsset"></param> * /// <param name="args">XML Node</param> * public void Visit(ActorAsset actorAsset, object[] args) * { * //FINISH: 检查资源存在性 * actorAsset.Source = currentNode.Attributes["src"].Value; * * foreach (XmlNode child in currentNode.ChildNodes) * { * switch (dic[child.Name]) * { * case "group": * actorAsset.Group = child.InnerText; * break; * * default: * continue; * } * } * * if (assetMap.ContainsKey(actorAsset.Name)) * { * kernel.IssueError(ErrorType.DuplicatedAsset, new Location(currentFile), * actorAsset.Name, "Actor"); * return; * } * * assetMap.Add(actorAsset.Name, actorAsset); * } * * public void Visit(CGAsset cgAsset, object[] args) * { * //FINISH: 检查资源存在性 * cgAsset.Source = currentNode.Attributes["src"].Value; * * foreach (XmlNode child in currentNode.ChildNodes) * { * switch (dic[child.Name]) * { * case "group": * cgAsset.Group = child.InnerText; * break; * * default: * continue; * } * } * * if (assetMap.ContainsKey(cgAsset.Name)) * { * kernel.IssueError(ErrorType.DuplicatedAsset, new Location(currentFile), * cgAsset.Name, "CG"); * return; * } * * assetMap.Add(cgAsset.Name, cgAsset); * } * * public void Visit(MusicAsset musicAsset, object[] args) * { * //TODO: 检查资源存在性 * musicAsset.Source = currentNode.Attributes["src"].Value; * * foreach (XmlNode child in currentNode.ChildNodes) * { * switch (dic[child.Name]) * { * case "group": * musicAsset.Group = child.InnerText; * break; * * case "title": * musicAsset.Title = child.InnerText; * break; * * case "artist": * musicAsset.Artist = child.InnerText; * break; * * case "lyricsBy": * musicAsset.LyricsBy = child.InnerText; * break; * * case "musicBy": * musicAsset.MusicBy = child.InnerText; * break; * * case "description": * musicAsset.Description = child.InnerText; * break; * * case "lyrics": * musicAsset.Lyrics = child.InnerText; * break; * * case "lrc": * musicAsset.LRC = child.InnerText; * //TODO: 检查和解析LRC * break; * * default: * continue; * } * } * * if (assetMap.ContainsKey(musicAsset.Name)) * { * kernel.IssueError(ErrorType.DuplicatedAsset, new Location(currentFile), * musicAsset.Name, "Music"); * return; * } * * assetMap.Add(musicAsset.Name, musicAsset); * } * * public void Visit(VideoAsset videoAsset, object[] args) * { * //TODO: 检查资源存在性 * videoAsset.Source = currentNode.Attributes["src"].Value; * * if (assetMap.ContainsKey(videoAsset.Name)) * { * kernel.IssueError(ErrorType.DuplicatedAsset, new Location(currentFile), * videoAsset.Name, "Video"); * return; * } * * assetMap.Add(videoAsset.Name, videoAsset); * } * #endregion */ public void Build(string[] assetFiles, FireMLRoot root) { assetMap = root.AssetMap; foreach (string file in assetFiles) { currentFile = file; xmlError = false; XmlDocument doc = new XmlDocument(); doc.Schemas = kernel.FireMLSchemaSet; try { doc.Load(file); } catch (Exception e) { kernel.IssueError(ErrorType.ReadFileError, new Location(file), e.Message); continue; } doc.Validate(new System.Xml.Schema.ValidationEventHandler(settings_ValidationEventHandler)); if (xmlError) { continue; } XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); nsmgr.AddNamespace("fm", FireEngine.Library.FireEngineConstant.FIREML_XMLNS); foreach (XmlNode node in doc.SelectSingleNode("fm:FireMLAsset", nsmgr).ChildNodes) { AssetDef def = new AssetDef(); AssetDataBase data; switch (dic[node.Name]) { case "Actor": data = FireMLDataBase.Deserialize <ActorAsset>(node.OuterXml); break; case "CG": data = FireMLDataBase.Deserialize <CGAsset>(node.OuterXml); break; case "Music": data = FireMLDataBase.Deserialize <MusicAsset>(node.OuterXml); break; case "Video": data = FireMLDataBase.Deserialize <VideoAsset>(node.OuterXml); break; default: continue; } string name = node.Attributes["Name"].Value; def.Name = name; def.Location = new Location(file); def.AssetData = data; if (assetMap.ContainsKey(name)) { kernel.IssueError(ErrorType.DuplicatedAsset, new Location(currentFile), name, data.GetType().Name); } else { assetMap.Add(name, def); } currentNode = node; } } }