Exemple #1
0
        public FormDefinition(string name, XDocument doc)
        {
            this.Name = name;

            this.AllowMultiple = doc.Root.OptionalBoolAttributeValue("AllowMultiple") ?? false;
            this.Calculateable = doc.Root.OptionalBoolAttributeValue("Calculateable") ?? true;

            var enums        = new Dictionary <string, EnumDefinition>();
            var structs      = new Dictionary <string, StructDefinition>();
            var lines        = new Dictionary <string, LineDefinition>();
            var lineByNumber = new Dictionary <string, LineDefinition>();
            var env          = new ParsingEnvironment()
            {
                CurrentFormName = name,
            };

            foreach (var node in doc.Root.Elements())
            {
                switch (node.Name.LocalName)
                {
                case "Enum":
                    enums.CheckNameAndAdd(node, new EnumDefinition(node));
                    break;

                case "Struct":
                    structs.CheckNameAndAdd(node, new StructDefinition(node));
                    break;

                case "Line":
                    var lineDef = lines.CheckNameAndAdd(node, new LineDefinition(env, node));
                    if (lineDef.Number is not null && !lineByNumber.TryAdd(lineDef.Number, lineDef))
                    {
                        throw new FileLoadException(node, $"Duplicate line number '{lineDef.Number}'.");
                    }
                    break;

                default:
                    throw new FileLoadException(node, $"Unexpected element '{node.Name}'.");
                }
            }


            this.Enums         = new ReadOnlyDictionary <string, EnumDefinition>(enums);
            this.Structs       = new ReadOnlyDictionary <string, StructDefinition>(structs);
            this.Lines         = new ReadOnlyDictionary <string, LineDefinition>(lines);
            this.LinesByNumber = new ReadOnlyDictionary <string, LineDefinition>(lineByNumber);
        }
Exemple #2
0
        public static BaseExpression ExpressionAttributeValue(this XElement el, ParsingEnvironment env, string attributeName)
        {
            XAttribute attr = el.Attribute(attributeName);

            if (attr is null)
            {
                throw new FileLoadException(el, $"Missing {attributeName} attribute");
            }
            try
            {
                return(MyExpressionParser.Parse(env, attr.Value));
            }
            catch (Exception ex)
            {
                throw new FileLoadException(attr, "Failed to parse ValueExpr", ex);
            }
        }
 private static string EnvToString(ParsingEnvironment parsingEnvironment)
 {
     switch (parsingEnvironment)
     {
         case ParsingEnvironment.CommandLine:
             return "command line args";
         case ParsingEnvironment.EnvironmentVariable:
             return "environment variable";
         case ParsingEnvironment.AppConfig:
             return "app.config appSettings";
         default:
             return "(not-specified)";
     }
 }