void WriteBlock(SimisJinxWriter writer, SimisTreeNode block) { writer.WriteToken(new SimisToken() { Kind = SimisTokenKind.Block, Type = block.Type, Name = block.Name }); if (block.Type.Length > 0) { writer.WriteToken(new SimisToken() { Kind = SimisTokenKind.BlockBegin }); WriteBlockChildren(writer, block); writer.WriteToken(new SimisToken() { Kind = SimisTokenKind.BlockEnd }); } }
void WriteBlockChildren(SimisJinxWriter writer, SimisTreeNode block) { foreach (var child in block) { var childValue = child as SimisTreeNodeValue; if (childValue != null) { if (child is SimisTreeNodeValueIntegerUnsigned) { writer.WriteToken(new SimisToken() { Kind = SimisTokenKind.IntegerUnsigned, Type = child.Type, Name = child.Name, IntegerUnsigned = (uint)childValue.Value }); } else if (child is SimisTreeNodeValueIntegerSigned) { writer.WriteToken(new SimisToken() { Kind = SimisTokenKind.IntegerSigned, Type = child.Type, Name = child.Name, IntegerSigned = (int)childValue.Value }); } else if (child is SimisTreeNodeValueIntegerDWord) { writer.WriteToken(new SimisToken() { Kind = SimisTokenKind.IntegerDWord, Type = child.Type, Name = child.Name, IntegerDWord = (uint)childValue.Value }); } else if (child is SimisTreeNodeValueIntegerWord) { writer.WriteToken(new SimisToken() { Kind = SimisTokenKind.IntegerWord, Type = child.Type, Name = child.Name, IntegerDWord = (ushort)childValue.Value }); } else if (child is SimisTreeNodeValueIntegerByte) { writer.WriteToken(new SimisToken() { Kind = SimisTokenKind.IntegerByte, Type = child.Type, Name = child.Name, IntegerDWord = (byte)childValue.Value }); } else if (child is SimisTreeNodeValueFloat) { writer.WriteToken(new SimisToken() { Kind = SimisTokenKind.Float, Type = child.Type, Name = child.Name, Float = (float)childValue.Value }); } else if (child is SimisTreeNodeValueString) { writer.WriteToken(new SimisToken() { Kind = SimisTokenKind.String, Type = child.Type, Name = child.Name, String = (string)childValue.Value }); } else { throw new InvalidDataException("Simis tree node " + child + " is not a known SimisTreeNodeValue descendant."); } } else { WriteBlock(writer, child); } } }