public void HmdIDPropertiesIDTest() { HmdBlockIDProperties testRoot = new HmdBlockIDProperties("The_Test_Root", new StaticCount(1), null); Assert.AreEqual(null, testRoot.definitionContext); Assert.AreEqual("the_test_root", testRoot.idLowerCase); Assert.AreEqual("the_test_root", testRoot.idWithContext); HmdBlockIDProperties level0Block = new HmdBlockIDProperties("Level0Block", UnrestrictedCount.Instance, testRoot); Assert.AreEqual(String.Empty, level0Block.definitionContext); Assert.AreEqual("level0block", level0Block.idLowerCase); Assert.AreEqual("level0block", level0Block.idWithContext); HmdBlockIDProperties level1Block = new HmdBlockIDProperties("Level1Block", UnrestrictedCount.Instance, level0Block); Assert.AreEqual("level0block", level1Block.definitionContext); Assert.AreEqual("level1block", level1Block.idLowerCase); Assert.AreEqual("level0block.level1block", level1Block.idWithContext); HmdBlockIDProperties level2Block = new HmdBlockIDProperties("Level2Block", UnrestrictedCount.Instance, level1Block); Assert.AreEqual("level0block.level1block", level2Block.definitionContext); Assert.AreEqual("level2block", level2Block.idLowerCase); Assert.AreEqual("level0block.level1block.level2block", level2Block.idWithContext); }
public static void Iterate(this HmdBlockID blockID, HmdProperties hmdProperties, AtValueIDWithProperties atValueIDWithProperties, AtBlockIDWithProperties atBlockIDWithProperties) { for (int i = 0; i < blockID.ChildCount; i++) { HmdID childID = blockID.GetChild(i); if (childID.isBlock) { HmdBlockID childBlockID = childID.CastAsBlockID; HmdBlockIDProperties childBlockIDProperties = hmdProperties.GetProperties(childBlockID); if (childBlockIDProperties == null) { throw new InvalidOperationException(String.Format("Found a block id \"{0}\", but it was not defined in the property dictionary", childID.idOriginalCase)); } atBlockIDWithProperties(childBlockID, childBlockIDProperties, hmdProperties); } else { HmdValueID childValueID = childID.CastAsValueID; HmdValueIDProperties childValueIDProperties = hmdProperties.GetProperties(childValueID); if (childValueIDProperties == null) { throw new InvalidOperationException(String.Format("Found a value id \"{0}\", but it was not defined in the property dictionary", childID.idOriginalCase)); } atValueIDWithProperties(childValueID, childValueIDProperties, hmdProperties); } } }
public void AddPropertiesFromExtraLinks(HmdBlockIDProperties context, T idProperties) { String extraLinkContext = HmdIDProperties.CombineIDContext(context.idWithContext, idProperties.idLowerCase); if (extraLinksDictionary.ContainsKey(extraLinkContext)) { throw new InvalidOperationException(String.Format("The extraLinksContext \"{0}\" has already been added to the HmdIdPropertiesTable::extraLinksDictionary", extraLinksDictionary)); } extraLinksDictionary.Add(extraLinkContext, idProperties); }
public HmdValueIDProperties(String idString, ICountProperty countProperty, HmdType hmdType, HmdEnumReference enumReference, HmdBlockIDProperties directParent, HmdParentReference[] parentOverrideList) : base(IsBlock, idString, countProperty, directParent, parentOverrideList) { if (hmdType == HmdType.Enumeration && enumReference == null) { throw new ArgumentNullException("For Enumeration types, must have an enumReference", "enumReference"); } this.hmdType = hmdType; this.enumReference = enumReference; }
public String GetTypeName(HmdBlockIDProperties blockIDProperties) { String typeName; if (!typeDictionary.TryGetValue(blockIDProperties, out typeName)) { typeName = GenerateBlockIDTypeName(blockIDProperties); typeDictionary.Add(blockIDProperties, typeName); } return(typeName); }
public HmdProperties(ICountProperty defaultCountProperty, HmdType defaultHmdType) { this.defaultCountProperty = defaultCountProperty; this.defaultHmdType = defaultHmdType; this.root = new HmdBlockIDProperties(RootName, new StaticCount(1), null); this.valueIDTable = new HmdIDPropertiesTable <HmdValueIDProperties>(); this.blockIDTable = new HmdIDPropertiesTable <HmdBlockIDProperties>(); //AddPropertiesFromDefinition(root); // should I add this? this.enumList = null; //this.enumInlineList = null; }
private void ValidateBlockID(HmdBlockID blockID, HmdBlockIDProperties blockIDProperties, HmdProperties hmdProperties) { // // Check that the current parent is valid // if (currentBlock == null) { debugOutput.Write(blockStack.Count, "Checking that \"{0}\" is the root...", blockID.idOriginalCase); if (!blockIDProperties.IsRoot) { throw new FormatException(String.Format("Block ID \"{0}\" was expected to be the root, but it wasn't?", blockIDProperties.idOriginalCase)); } debugOutput.WriteLine("Pass."); } else { debugOutput.Write(blockStack.Count, "Checking that \"{0}\" has \"{1}\" as a valid parent...", blockID.idOriginalCase, currentBlock.blockIDProperties.idOriginalCase); if (!blockIDProperties.IsValidParent(currentBlock.blockIDProperties)) { throw new FormatException(String.Format("Block ID \"{0}\" appeared in Block \"{1}\", but this is not allowed with the current properties", blockIDProperties.idOriginalCase, currentBlock.blockIDProperties.idOriginalCase)); } debugOutput.WriteLine("Pass."); // Add ID to current block validator currentBlock.NewChild(blockIDProperties); } // // Verify the Children of the Block ID // debugOutput.WriteLine(blockStack.Count, "{"); blockStack.Push(currentBlock); currentBlock = new HmdBlockValidator(blockIDProperties); blockID.Iterate(hmdProperties, ValidateValueID, ValidateBlockID); // Validate Children debugOutput.Write(blockStack.Count, "Checking counts of all children for \"{0}\"...", blockID.idOriginalCase); currentBlock.ValidateChildren(hmdProperties); debugOutput.WriteLine("Pass."); currentBlock = blockStack.Pop(); debugOutput.WriteLine(blockStack.Count, "}} (end of \"{0}\")", blockID.idOriginalCase); }
private void AddPropertiesFromExtraLinks(String context, HmdIDProperties idProperties) { if (idProperties.isBlock) { HmdBlockIDProperties blockIDProperties = idProperties.CastAsBlockIDProperties; blockIDTable.AddPropertiesFromExtraLinks(context, blockIDProperties); String newContext = HmdIDProperties.CombineIDContext(context, idProperties.idLowerCase); foreach (HmdIDProperties childIDProperties in blockIDProperties) { AddPropertiesFromExtraLinks(newContext, childIDProperties); } } else { valueIDTable.AddPropertiesFromExtraLinks(context, idProperties.CastAsValueIDProperties); } }
public void ResolveParentOverrideLinks(HmdProperties hmdProperties) { if (parentOverrideList != null) { TextWriter debugOutput = HmdDebug.DebugOutput; if (debugOutput == null) { debugOutput = TextWriter.Null; } for (int i = 0; i < parentOverrideList.Length; i++) { // // Get the parent reference // HmdBlockIDProperties parentBlock = parentOverrideList[i].TryToGetReferenceAsBlock(); if (parentBlock == null) { parentBlock = hmdProperties.GetParentPropertiesInScope(this, parentOverrideList[i]); if (parentBlock == null) { throw new InvalidOperationException(String.Format("Parent \"{0}\" is not defined in the property dictionary", parentOverrideList[i].IDOriginalCase)); } debugOutput.WriteLine("For ID \"{0}\", resolved Parent reference to \"{1}\"", idOriginalCase, parentBlock.idOriginalCase); parentOverrideList[i] = parentBlock; // cache the reference } // // Make sure the parent has this child linked // parentBlock.AddIndirectChildFromFromItsOverrideList(this); // // Add this link as a key to the HmdPropertiesTable // hmdProperties.AddPropertiesFromExtraLinks(parentBlock, this); } } }
public Boolean IsValidParent(HmdBlockIDProperties parent) { if (parentOverrideList == null) { if (directParent == parent) { return(true); } } else { for (int i = 0; i < parentOverrideList.Length; i++) { if (parent == parentOverrideList[i]) { return(true); } if (parent.idLowerCase.Equals(parentOverrideList[i].IDLowerCase, StringComparison.CurrentCulture)) { parentOverrideList[i] = parent; // cache the reference return(true); } } } if (additionalParents != null) { for (int i = 0; i < additionalParents.Count; i++) { if (parent == additionalParents[i]) { return(true); } } } return(false); }
protected HmdIDProperties(Boolean isBlock, String id, ICountProperty countProperty, HmdBlockIDProperties directParent, HmdParentReference[] parentOverrideList) { if (id == null) { throw new ArgumentNullException("idString"); } this.idOriginalCase = id; this.idLowerCase = id.ToLower(); if (directParent == null) { this.definitionContext = null; } else if (directParent.definitionContext == null) { this.definitionContext = String.Empty; } else { this.definitionContext = directParent.idWithContext; } this.idWithContext = CombineIDContext(this.definitionContext, idLowerCase); this.isBlock = isBlock; if (countProperty == null) { throw new ArgumentNullException("countProperty"); } this.countProperty = countProperty; this.directParent = directParent; this.parentOverrideList = parentOverrideList; this.additionalParents = null; }
public HmdBlockIDProperties(String idString, ICountProperty countProperty, HmdBlockIDProperties definitionParent) : base(IsBlock, idString, countProperty, definitionParent, null) { }
public void AddAdditionalParentFromItsAdditionalChildrenList(HmdBlockIDProperties newParent) { throw new NotImplementedException(); //need to figure out what kind of children can be added to a block id's AdditionalChildList }
public HmdBlockValidator(HmdBlockIDProperties blockIDProperties) { this.blockIDProperties = blockIDProperties; }
private static void ParsePropertiesFile(HmdBlockIDProperties propertyBlockRoot, HmdProperties hmdProperties, HmdTokenizer tokenizer, String importPath, Boolean isPImportFile) { TextWriter debugOutput = HmdDebug.DebugOutput; if (debugOutput == null) { debugOutput = TextWriter.Null; } if (propertyBlockRoot == null) { throw new ArgumentNullException("propertyBlockRoot"); } // // TODO: What about pimport files? Should they require a %props block? If not, then can they put it anyways? I'll need to add another argument to this argument list // that will say whether or not it is a PImport so it can gracefully end on EOF instead of '}' (close brace) // // // TODO: MAKE SURE YOU DISALLOW SPECIFYING %PROPS VALUE ID in a BLOCK TWICE!!! // // HmdBlockIDProperties currentParent = propertyBlockRoot; Stack <HmdBlockIDProperties> parentStack = new Stack <HmdBlockIDProperties>(); while (true) { HmdGlobalToken token = tokenizer.NextGlobalToken(); // // Check for EOF // if (token.type == HmdGlobalTokenType.EOF) { if (isPImportFile && parentStack.Count <= 0) { return; } else { throw new FormatException("Reached EOF inside a %props block directive"); } } if (token.type == HmdGlobalTokenType.ID) { String idString = token.text; Boolean isBlockID; Boolean isEmptyID = tokenizer.NextIDType(out isBlockID); if (isEmptyID) { // this just means the value ID has all the defaults debugOutput.WriteLine("EmptyProp ID: {0}", idString); HmdValueIDProperties valueIDProperties = new HmdValueIDProperties(idString, hmdProperties.defaultCountProperty, hmdProperties.defaultHmdType, null, currentParent, null); if (!valueIDProperties.DirectParentIsOverriden) { currentParent.AddDirectChildWithNoParentOverrideList(valueIDProperties); } hmdProperties.AddPropertiesFromDefinition(valueIDProperties); } else if (!isBlockID) { debugOutput.WriteLine("ValProp ID: {0}", idString); String nextValue = tokenizer.NextValue(); debugOutput.WriteLine("ValProp : {0}", nextValue); HmdValueIDProperties valueIDProperties = HmdParser.ParseValueProperties(idString, nextValue, currentParent, hmdProperties); if (!valueIDProperties.DirectParentIsOverriden) { currentParent.AddDirectChildWithNoParentOverrideList(valueIDProperties); } hmdProperties.AddPropertiesFromDefinition(valueIDProperties); } else { debugOutput.WriteLine("BlkProp ID: {0}", idString); HmdBlockIDProperties blockIDProperties = new HmdBlockIDProperties(idString, hmdProperties.defaultCountProperty, currentParent); // wait to add this child to the current parent so we know whether or not it's default parent is overriden hmdProperties.AddPropertiesFromDefinition(blockIDProperties); parentStack.Push(currentParent); currentParent = blockIDProperties; } } else if (token.type == HmdGlobalTokenType.Directive) { String directiveID = token.text; Boolean isBlockID; Boolean isEmptyID = tokenizer.NextIDType(out isBlockID); if (isEmptyID) { throw new NotImplementedException(); } else if (!isBlockID) { // // TODO: Props Blocks should not allow %import directives, they should only allow %pimport directives // if (token.text.Equals("import", StringComparison.CurrentCulture)) { throw new FormatException("%import directive not allowed inside a %prop block"); } else if (token.text.Equals("pimport", StringComparison.CurrentCulture)) { String nextValue = tokenizer.NextValue(); debugOutput.WriteLine("%PImport : {0}", nextValue); String importFileAndPathName = Path.Combine(importPath, nextValue); using (FileStream importStream = new FileStream(importFileAndPathName, FileMode.Open)) { debugOutput.WriteLine("File Start: {0}", importFileAndPathName); ParsePropertiesFile(currentParent, hmdProperties, new HmdTokenizer(new StreamReader(importStream), 1), importPath, false); debugOutput.WriteLine("File End : {0}", importFileAndPathName); } } else if (token.text.Equals("enum", StringComparison.CurrentCulture)) { String nextValue = tokenizer.NextValue(); debugOutput.WriteLine("%Enum : {0}", nextValue); hmdProperties.AddEnum(new HmdEnum(nextValue)); } else if (token.text.Equals("props", StringComparison.CurrentCulture)) { if (parentStack.Count <= 0) { throw new FormatException("You can't specify a %props value on the root"); } String nextValue = tokenizer.NextValue(); debugOutput.WriteLine("%Props : {0}", nextValue); HmdParser.ParseAndOverrideBlockProperties(currentParent, nextValue); } else { throw new Exception(String.Format("Parser (line {0}): Unrecognized value directive \"{1}\"", token.line, token.text)); } } else { if (token.text.Equals("props", StringComparison.CurrentCulture)) { throw new FormatException("Right now this is just weird, why do you have a %props block inside a props block (Maybe I'll let this slide later)?"); debugOutput.WriteLine("Block ID : %props Directive"); if (hmdProperties == null) { debugOutput.WriteLine("Not Parsing %props Directive Block ID..."); throw new NotImplementedException("Haven't implemented the feature to parse without doing the props block"); } else { ParsePropertiesFile(hmdProperties.root, hmdProperties, tokenizer, importPath, false); } } else if (token.text.Equals("group", StringComparison.CurrentCulture)) { throw new NotImplementedException(); } else { throw new Exception(String.Format("Parser (line {0}): Unrecognized block directive \"{1}\"", token.line, token.text)); } } } else if (token.type == HmdGlobalTokenType.CloseBrace) { if (parentStack.Count <= 0) { debugOutput.WriteLine("%Props End:"); return; } debugOutput.WriteLine("Block End : {0}", currentParent.idOriginalCase); HmdBlockIDProperties temp = currentParent; currentParent = parentStack.Pop(); if (!temp.DirectParentIsOverriden) { currentParent.AddDirectChildWithNoParentOverrideList(temp); } } else { throw new FormatException(String.Format("Parser (line {0}): Unexpected token {1}", token.line, token)); } } }
// // Maybe change to pass in the string offset and length? // public static HmdValueIDProperties ParseValueProperties(String idString, String props, HmdBlockIDProperties definitionParent, HmdProperties hmdProperties) { if (idString == null) { throw new ArgumentNullException("idString"); } Boolean defaultCountPropertyOverriden = false; Boolean defaultHmdTypeOverriden = false; ICountProperty countProperty = hmdProperties.defaultCountProperty; HmdType hmdType = hmdProperties.defaultHmdType; HmdEnumReference enumReference = null; HmdParentReference[] parentOverrideList = null; Int32 offset = 0, saveOffset; // // TODO: To save on memory, maybe I'll add some type of hash lookup so I don't have to instantiate multiple HmdType classes? // while (true) { while (true) { if (offset >= props.Length) { return(new HmdValueIDProperties(idString, countProperty, hmdType, enumReference, definitionParent, parentOverrideList)); } if (!Char.IsWhiteSpace(props[offset])) { break; } offset++; } if (props[offset] >= '0' && props[offset] <= '9') { saveOffset = offset; // keep going while you see 0-9, '-' or '*' do { offset++; if (offset >= props.Length) { break; } } while ((props[offset] >= '0' && props[offset] <= '9') || props[offset] == '-' || props[offset] == '*'); // // Check that the 'count' property has not been specified Twice // if (defaultCountPropertyOverriden) { throw new FormatException("You've specified the 'count' property twice!"); } defaultCountPropertyOverriden = true; countProperty = CountProperty.Parse(props.Substring(saveOffset, offset - saveOffset)); } else if (props[offset] == 's') { if (offset + 6 > props.Length) // 6 = "string".Length { throw new FormatException(String.Format("Found character '{0}', expected to become \"{1}\", but there are some characters missing", HmdTypeClass.String[0], HmdTypeClass.String)); } if (props[offset + 1] != 't' || props[offset + 2] != 'r' || props[offset + 3] != 'i' || props[offset + 4] != 'n' || props[offset + 5] != 'g') { throw new FormatException(String.Format("Expected 'string', but got '{0}'", props.Substring(offset, 6))); } offset += 6; // // Check that the 'type' property has not been specified Twice // if (defaultHmdTypeOverriden) { throw new FormatException("You've specified the 'type' property twice!"); } defaultHmdTypeOverriden = true; hmdType = HmdType.String; } else if (props[offset] == HmdTypeClass.Boolean[0]) { if (offset + HmdTypeClass.Boolean.Length > props.Length) { throw new FormatException( String.Format("Found character '{0}', expected to become \"{1}\", but there are some characters missing", HmdTypeClass.Boolean[0], HmdTypeClass.Boolean)); } offset++; for (int i = 1; i < HmdTypeClass.Boolean.Length; i++) { if (props[offset] != HmdTypeClass.Boolean[i]) { throw new FormatException(String.Format("Expected \"{0}\", but got \"{1}\"", HmdTypeClass.Boolean, props.Substring(offset - i, HmdTypeClass.Boolean.Length))); } offset++; } // // Check that the 'type' property has not been specified Twice // if (defaultHmdTypeOverriden) { throw new FormatException("You've specified the 'type' property twice!"); } defaultHmdTypeOverriden = true; hmdType = HmdType.Boolean; } else if (props[offset] == 'i' || props[offset] == 'u') { Byte byteSize; Boolean isUnsigned = false; if (props[offset] == 'u') { isUnsigned = true; offset++; if (props[offset] != 'i') { throw new FormatException( String.Format("Found character 'u', expected to become \"uint\", but the next character was '{0}'", props[offset])); } } if (offset + 3 > props.Length) { throw new FormatException( String.Format("Found character '{0}', expected to become \"{1}\", but there are some characters missing", isUnsigned ? 'u' : 'i', isUnsigned ? "uint" : "int")); } if (props[offset + 1] != 'n' || props[offset + 2] != 't') { throw new FormatException(String.Format("Expected \"{0}\", but got \"{1}\"", isUnsigned ? "uint" : "int", isUnsigned ? props.Substring(offset - 1, 4) : props.Substring(offset, 3))); } offset += 3; if (offset < props.Length && props[offset] >= '0' && props[offset] <= '9') { saveOffset = offset; do { offset++; } while (offset < props.Length && props[offset] >= '0' && props[offset] <= '9'); byteSize = Byte.Parse(props.Substring(saveOffset, offset - saveOffset)); } else { byteSize = 0; } // // Check that the 'type' property has not been specified Twice // if (defaultHmdTypeOverriden) { throw new FormatException("You've specified the 'type' property twice!"); } defaultHmdTypeOverriden = true; hmdType = HmdTypeClass.GetIntegerType(isUnsigned, byteSize); } else if (props[offset] == 'e') { offset++; if (offset >= props.Length) { throw new FormatException("Found character 'e', expected to become \"enum\" or \"empty\" but the string abrubtly ended"); } if (props[offset] == HmdTypeClass.Empty[1]) { if (offset + HmdTypeClass.Empty.Length - 1 > props.Length) { throw new FormatException("Found \"em\", expected to become \"empty\", but there are some characters missing"); } offset++; for (int i = 2; i < HmdTypeClass.Empty.Length; i++) { if (props[offset] != HmdTypeClass.Empty[i]) { throw new FormatException(String.Format("Expected \"{0}\", but got \"{1}\"", HmdTypeClass.Empty, props.Substring(offset - i, HmdTypeClass.Empty.Length))); } offset++; } // // Check that the 'type' property has not been specified Twice // if (defaultHmdTypeOverriden) { throw new FormatException("You've specified the 'type' property twice!"); } defaultHmdTypeOverriden = true; hmdType = HmdType.Empty; } else if (props[offset] == HmdTypeClass.Enumeration[1]) { if (offset + HmdTypeClass.Enumeration.Length + 1 > props.Length) { throw new FormatException( String.Format("Found \"en\", expected to become \"{0}\", but there are some characters missing", HmdTypeClass.Enumeration)); } offset++; for (int i = 2; i < HmdTypeClass.Enumeration.Length; i++) { if (props[offset] != HmdTypeClass.Enumeration[i]) { throw new FormatException(String.Format("Expected \"{0}\", but got \"{1}\"", HmdTypeClass.Enumeration, props.Substring(offset - i, HmdTypeClass.Enumeration.Length))); } offset++; } // skip whitespace while (true) { if (offset >= props.Length) { throw new FormatException("Expected '(' or 'a-zA-Z', but got EOF"); } if (!Char.IsWhiteSpace(props[offset])) { break; } offset++; } if (props[offset] == '(') { saveOffset = offset + 1; // skip to the next whitespace or ';' while (true) { offset++; if (offset >= props.Length) { throw new FormatException("Expected ')' but reached end of string"); } if (props[offset] == ')') { break; } } String enumReferenceName = (definitionParent == null || definitionParent.definitionContext == null) ? idString.ToLower() : HmdIDProperties.CombineIDContext(definitionParent.idWithContext, idString.ToLower()); HmdEnum newInlineEnum = new HmdEnum(enumReferenceName, props.Substring(saveOffset, offset - saveOffset)); enumReference = newInlineEnum; if (hmdProperties != null) { hmdProperties.AddEnum(newInlineEnum); } offset++; if (defaultHmdTypeOverriden) { throw new FormatException("You've specified the 'type' property twice!"); } defaultHmdTypeOverriden = true; hmdType = HmdType.Enumeration; } else if ((props[offset] >= 'a' && props[offset] <= 'z') || (props[offset] >= 'A' && props[offset] <= 'Z')) { saveOffset = offset; // skip to the next whitespace or ';' while (true) { offset++; if (offset >= props.Length) { break; } if (Char.IsWhiteSpace(props[offset])) { break; } } if (offset - saveOffset <= 0) { throw new FormatException("Unable to parse enum type, the \"enum\" keyword must be either \"enum <type>\" (with only one space before <type>) or \"enum(<value> <value> ...)\""); } enumReference = new HmdEnumReferenceByString(props.Substring(saveOffset, offset - saveOffset)); if (defaultHmdTypeOverriden) { throw new FormatException("You've specified the 'type' property twice!"); } defaultHmdTypeOverriden = true; hmdType = HmdType.Enumeration; } else { throw new FormatException(String.Format("Expected '(' or 'a-zA-Z' after \"enum\", but got '{0}'", props[offset])); } } else { throw new FormatException(String.Format( "Found character 'e', expected to become \"enum\" or \"empty\" but the second character is '{0}'", props[offset])); } } else if (props[offset] == '(') { if (parentOverrideList != null) { throw new FormatException("You've specified the 'parents' property twice!"); } parentOverrideList = ParseParentList(props, ref offset); } else { throw new FormatException( String.Format("Could not recognize first character of property '{0}', of the props string \"{1}\"", props[offset], props)); } } }
public void GenerateParserClasses(TextWriter output, HmdBlockIDProperties block, HmdProperties hmdProperties, String hmdTypePrefix, Boolean isRoot) { String className = isRoot ? rootClassName : (hmdTypePrefix + typeNameTable.GetTypeName(block)); // // Generate the class for the current block // int tabs = 1; output.WriteLine(tabs, "public class {0}", className); output.WriteLine(tabs++, "{"); // // Print Fields // foreach (HmdIDProperties childIDProperties in block) { if (childIDProperties.isBlock) { HmdBlockIDProperties childBlockProperties = childIDProperties.CastAsBlockIDProperties; String type = hmdTypePrefix + typeNameTable.GetTypeName(childBlockProperties); if (childBlockProperties.CountProperty.Multiple) { type = languageGenerator.ListType(type); } output.WriteLine(tabs, "public {0} {1};", type, childBlockProperties.idOriginalCase); } else { HmdValueIDProperties childValueProperties = childIDProperties.CastAsValueIDProperties; if (childValueProperties.hmdType != HmdType.Empty) { String type; if (childValueProperties.hmdType == HmdType.Enumeration) { HmdEnum hmdEnum = childValueProperties.EnumReference.TryGetReference; if (hmdEnum == null) { hmdEnum = hmdProperties.TryGetEnum(childValueProperties.EnumReference.Name); if (hmdEnum == null) { throw new FormatException(String.Format("Can't resolve enum reference '{0}'", childValueProperties.EnumReference.Name)); } childValueProperties.ResolveEnumReference(hmdEnum); } type = typeNameTable.GetTypeName(hmdEnum); } else { type = languageGenerator.HmdTypeToLanguageType(childValueProperties.hmdType); } if (childValueProperties.CountProperty.Multiple) { type = languageGenerator.ListType(type); } output.WriteLine(tabs, "public {0} {1};", type, childValueProperties.idOriginalCase); } } } // // Print Constructor // output.WriteLine(tabs, "public {0}(HmdBlockID blockID, HmdProperties hmdProperties)", className); output.WriteLine(tabs++, "{"); output.WriteLine(tabs, "for(int i = 0; i < blockID.ChildCount; i++)"); output.WriteLine(tabs++, "{"); output.WriteLine(tabs, "HmdID childID = blockID.GetChild(i);"); output.WriteLine(tabs, "if(childID.isBlock)"); output.WriteLine(tabs++, "{"); output.WriteLine(tabs, "HmdBlockID childBlockID = (HmdBlockID)childID;"); Int32 blockChildCount = 0; foreach (HmdIDProperties childIDProperties in block) { if (childIDProperties.isBlock) { HmdBlockIDProperties childBlockProperties = childIDProperties.CastAsBlockIDProperties; blockChildCount++; output.WriteLine(tabs, "// parse field {0}", childIDProperties.idOriginalCase); output.WriteLine(tabs, "{0}if(childBlockID.idLowerCase.Equals(\"{1}\",StringComparison.CurrentCultureIgnoreCase))", blockChildCount > 1 ? "else " : String.Empty, childIDProperties.idLowerCase); output.WriteLine(tabs++, "{"); if (childIDProperties.CountProperty.Multiple) { output.WriteLine(tabs, "// set List to not null"); output.WriteLine(tabs, "this.{0}.Add(new {1}{2}(childBlockID, hmdProperties));", childIDProperties.idOriginalCase, hmdTypePrefix, typeNameTable.GetTypeName(childBlockProperties)); } else { output.WriteLine(tabs, "// check that field is not set already"); output.WriteLine(tabs, "if(this.{0} != null)", childIDProperties.idOriginalCase); output.WriteLine(tabs++, "{"); output.WriteLine(tabs, "throw new FormatException(\"Found multiple block id's \\\"{0}\\\"\");", childIDProperties.idOriginalCase); output.WriteLine(--tabs, "}"); output.WriteLine(tabs, "this.{0} = new {1}{2}(childBlockID, hmdProperties);", childIDProperties.idOriginalCase, hmdTypePrefix, typeNameTable.GetTypeName(childBlockProperties)); } output.WriteLine(--tabs, "}"); } } if (blockChildCount > 0) { output.WriteLine(tabs, "else"); output.WriteLine(tabs++, "{"); } output.WriteLine(tabs, "throw new FormatException(String.Format(\"Unrecognized child block id \\\"{0}\\\"\",childID.idOriginalCase));"); if (blockChildCount > 0) { output.WriteLine(--tabs, "}"); } output.WriteLine(--tabs, "}"); output.WriteLine(tabs, "else"); output.WriteLine(tabs++, "{"); output.WriteLine(tabs, "HmdValueID childValueID = (HmdValueID)childID;"); Int32 valueChildCount = 0; foreach (HmdIDProperties childIDProperties in block) { if (!childIDProperties.isBlock) { HmdValueIDProperties childValueIDProperties = childIDProperties.CastAsValueIDProperties; valueChildCount++; output.WriteLine(tabs, "// parse field {0}", childIDProperties.idOriginalCase); output.WriteLine(tabs, "{0}if(childValueID.idLowerCase.Equals(\"{1}\",StringComparison.CurrentCultureIgnoreCase))", valueChildCount > 1 ? "else " : String.Empty, childIDProperties.idLowerCase); output.WriteLine(tabs++, "{"); String variableName = "childValueID.value"; String parseCode = null; if (childValueIDProperties.hmdType == HmdType.Enumeration) { parseCode = languageGenerator.GenerateStringToEnumParseCode( typeNameTable.GetTypeName(childValueIDProperties.EnumReference.TryGetReference), variableName); } else { parseCode = languageGenerator.GenerateStringToTypeParseCode( childValueIDProperties.hmdType, variableName); } if (childIDProperties.CountProperty.Multiple) { output.WriteLine(tabs, "this.{0}.Add({1});", childIDProperties.idOriginalCase, parseCode); } else { output.WriteLine(tabs, "// check that field is not set already"); output.WriteLine(tabs, "if(this.{0} != null)", childIDProperties.idOriginalCase); output.WriteLine(tabs++, "{"); output.WriteLine(tabs, "throw new FormatException(\"Found multiple value id's \\\"{0}\\\"\");", childIDProperties.idOriginalCase); output.WriteLine(--tabs, "}"); output.WriteLine(tabs, "this.{0} = {1};", childIDProperties.idOriginalCase, parseCode); } output.WriteLine(--tabs, "}"); } } if (valueChildCount > 0) { output.WriteLine(tabs, "else"); output.WriteLine(tabs++, "{"); } output.WriteLine(tabs, "throw new FormatException(String.Format(\"Unrecognized child value id \\\"{0}\\\"\",childID.idOriginalCase));"); if (valueChildCount > 0) { output.WriteLine(--tabs, "}"); } output.WriteLine(--tabs, "}"); output.WriteLine(--tabs, "}"); output.WriteLine(--tabs, "}"); output.WriteLine(--tabs, "}"); }
public static void ParseAndOverrideBlockProperties(HmdBlockIDProperties blockIDProperties, String props) { if (blockIDProperties == null) { throw new ArgumentNullException("blockIDProperties"); } ICountProperty countPropertyOverride = null; HmdParentReference[] parentOverrideList = null; Int32 offset = 0, saveOffset; // // TODO: To save on memory, maybe I'll add some type of hash lookup so I don't have to instantiate multiple HmdType classes? // while (true) { while (true) { if (offset >= props.Length) { if (countPropertyOverride != null) { blockIDProperties.OverrideCountProperty(countPropertyOverride); } if (parentOverrideList != null) { blockIDProperties.SetParentOverrideList(parentOverrideList); } return; } if (!Char.IsWhiteSpace(props[offset])) { break; } offset++; } if (props[offset] >= '0' && props[offset] <= '9') { saveOffset = offset; // keep going while you see 0-9, '-' or '*' do { offset++; if (offset >= props.Length) { break; } } while ((props[offset] >= '0' && props[offset] <= '9') || props[offset] == '-' || props[offset] == '*'); // // Check that the 'count' property has not been specified Twice // if (countPropertyOverride != null) { throw new FormatException("You've specified the 'count' property twice!"); } countPropertyOverride = CountProperty.Parse(props.Substring(saveOffset, offset - saveOffset)); } else if (props[offset] == '(') { if (parentOverrideList != null) { throw new FormatException("You've specified the 'parents' property twice!"); } parentOverrideList = ParseParentList(props, ref offset); } else { throw new FormatException(String.Format("Could not recognize first character of property '{0}', of the props string \"{1}\"", props[offset], props)); } } }
public HmdIDProperties TryToGetChildInScope(HmdBlockIDProperties parent, HmdIDReference childReference) { throw new NotImplementedException(); }
public HmdBlockIDPropertiesEnumerator(HmdBlockIDProperties blockIDProperties) { this.blockIDProperties = blockIDProperties; state = 0; index = -1; }
private String GenerateBlockIDTypeName(HmdBlockIDProperties blockIDProperties) { return(blockIDProperties.idWithContext.Replace(".", String.Empty)); }
public void AddPropertiesFromDefinition(HmdBlockIDProperties blockIDProperties) { blockIDTable.AddPropertiesFromDefinition(blockIDProperties); }