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); }
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)"; } }