示例#1
0
        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);
        }
示例#2
0
 public override void Visit(FireMLRoot root, object[] args)
 {
     if (root.MainPlot == null)
     {
         kernel.IssueError(ErrorType.MainPlotNotExist, new Location(""));
     }
     base.Visit(root, args);
 }
示例#3
0
        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();
            }
        }
示例#4
0
        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);
            }
        }
示例#5
0
        /*
         #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;
                }
            }
        }