namespace EightBit { using System; using System.Collections.Generic; using System.IO; public class Symbols { private readonly Dictionary labels; private readonly Dictionary constants; private readonly Dictionary scopes; private readonly Dictionary addresses; private readonly Dictionary>> parsed; public Symbols() : this("") { } public Symbols(string path) { labels = new Dictionary(); constants = new Dictionary(); scopes = new Dictionary(); addresses = new Dictionary(); parsed = new Dictionary>>(); if (path.Length > 0) { Parse(path); AssignSymbols(); AssignScopes(); } } public Dictionary Labels => labels; public Dictionary Constants => constants; public Dictionary Scopes => scopes; public Dictionary Addresses => addresses; private void AssignScopes() { var parsedScopes = parsed["scope"]; foreach (var parsedScopeElement in parsedScopes) { var parsedScope = parsedScopeElement.Value; var name = parsedScope["name"]; var trimmedName = name.Substring(1, name.Length - 2); var size = parsedScope["size"]; scopes[trimmedName] = ushort.Parse(size); } } private void AssignSymbols() { var symbols = parsed["sym"]; foreach (var symbolElement in symbols) { var symbol = symbolElement.Value; var name = symbol["name"]; var trimmedName = name.Substring(1, name.Length - 2); var value = symbol["val"].Substring(2); var number = Convert.ToUInt16(value, 16); var symbolType = symbol["type"]; if (symbolType == "lab") { labels[number] = trimmedName; addresses[trimmedName] = number; } else if (symbolType == "equ") { constants[number] = trimmedName; } } } private void Parse(string path) { using (var reader = new StreamReader(path)) { while (!reader.EndOfStream) { var line = reader.ReadLine(); var lineElements = line.Split(' ', '\t'); if (lineElements.Length == 2) { var type = lineElements[0]; var dataElements = lineElements[1].Split(','); var data = new Dictionary(); foreach (var dataElement in dataElements) { var definition = dataElement.Split('='); if (definition.Length == 2) data[definition[0]] = definition[1]; } if (data.ContainsKey("id")) { if (!parsed.ContainsKey(type)) parsed[type] = new Dictionary>(); var id = data["id"]; data.Remove("id"); parsed[type][id] = data; } } } } } } }