//#8 in the assignment public void CheckDuplicateDecls() { // Classes ClassSymbolTables.GetDupedValuesBy(x => x.ClassName) .ForEach(x => { _errorStream.WriteLine($"Multiple declaration of class: \"{x.ClassName}\""); Console.WriteLine($"Error: Multiple declaration of class: \"{x.ClassName}\""); }); // Data Member foreach (var classTable in ClassSymbolTables) { var varDecls = classTable.Entries.Where(x => x is ClassSymbolTableEntryVariable).Cast <ClassSymbolTableEntryVariable>(); varDecls.GetDupedValuesBy(x => x.Name) .ForEach(x => { _errorStream.WriteLine($"Multiple declaration of variable: \"{x.Name}\" in class \"{classTable.ClassName}\""); Console.WriteLine($"Error: Multiple declaration of variable: \"{x.Name}\" in class \"{classTable.ClassName}\""); }); var funcDefs = classTable.Entries.Where(x => x is ClassSymbolTableEntryFunction).Cast <ClassSymbolTableEntryFunction>().ToList(); funcDefs.GetDupedValuesBy(x => x.ToStringSignatureNoReturn()) .ForEach(x => { _errorStream.WriteLine($"Multiple function declaration for function {x.ToStringSignatureNoReturn()}"); Console.WriteLine($"Error: Multiple function declaration for function {x.ToStringSignatureNoReturn()}"); }); } // Functions var funcDefns = FunctionSymbolTable.Entries.Cast <FunctionSymbolTableEntry>().ToList(); funcDefns.GetDupedValuesBy(x => x.ToStringSignatureNoReturn()) .ForEach(x => { _errorStream.WriteLine($"Multiple function definitions for function {x.ToStringSignatureNoReturn()}"); Console.WriteLine($"Error: Multiple function definitions for function {x.ToStringSignatureNoReturn()}"); }); // Locals foreach (var funcDefn in funcDefns) { var locals = funcDefn.LocalScope; locals.GetDupedValuesBy(x => x.ToString(), StringComparer.Ordinal) .ForEach(x => { _errorStream.WriteLine($"Multiple declaration of local variable: \"{x}\" in function definition \"{funcDefn.ToStringSignature()}\""); Console.WriteLine($"Error: Multiple declaration of local variable: \"{x}\" in function definition \"{funcDefn.ToStringSignature()}\""); }); } }
//NOTE(AFL): I'm running out of time, this is not implemented the best way... #region Validation Steps // #5 in assignment public void CheckShadowedMembers() { foreach (var classTable in ClassSymbolTables.Where(x => x.Inherits.Any())) { var shadowedFunctions = classTable.GetFunctions().GroupBy(x => x.ToStringSignatureNoReturn(false)).Where(x => x.Count() > 1).ToList(); foreach (var shadowedFunction in shadowedFunctions) { _errorStream.WriteLine($"Class {classTable.ClassName} is shadowing function: {shadowedFunction.Key}"); Console.WriteLine($"Warning: Class {classTable.ClassName} is shadowing function: {shadowedFunction.Key}"); } } }
// #14 in the assignment public void CheckCircularDependencies() { var dedupedClasses = ClassSymbolTables.DedupeBy(x => x.ClassName); var inheritMap = dedupedClasses.ToDictionary(x => x.ClassName, x => x.Inherits.Concat(x.GetDataMemberTypes()).DedupeBy(y => y)); var cycles = inheritMap.FindCycles(); foreach (var cycle in cycles) { _errorStream.WriteLine("Dependency loop detected:"); Console.WriteLine("Error: Dependency loop detected:"); foreach (var className in cycle) { _errorStream.WriteLine($" {className}"); Console.WriteLine($"Error: {className}"); } } }
// #6 in the assignment public void CheckDeclAndDefn() { // Check definition exists foreach (var classTable in ClassSymbolTables) { var functionDecls = classTable.Entries.Where(x => x is ClassSymbolTableEntryFunction).Cast <ClassSymbolTableEntryFunction>(); foreach (var functionDecl in functionDecls) { if (!FunctionDefnFound(functionDecl)) { _errorStream.WriteLine($"No definition for declared member function: {functionDecl} in class {classTable.ClassName}"); Console.WriteLine($"ERROR: No definition for declared member function: {functionDecl} in class {classTable.ClassName}"); } } } // Check decl exists foreach (var entry in FunctionSymbolTable.Entries.Cast <FunctionSymbolTableEntry>()) { if (!string.IsNullOrEmpty(entry.ScopeSpec)) { var classTable = ClassSymbolTables.FirstOrDefault(x => string.Equals(x.ClassName, entry.ScopeSpec)); if (classTable == null) { _errorStream.WriteLine($"function definition provided for undeclared class: \"{entry.ScopeSpec}\" | {entry.ToStringSignature()}"); Console.WriteLine($"Error: function definition provided for undeclared class: \"{entry.ScopeSpec}\" | {entry.ToStringSignature()}"); continue; } var decls = classTable.Entries.Where(x => x is ClassSymbolTableEntryFunction).Cast <ClassSymbolTableEntryFunction>(); bool declExists = FunctionDeclFound(decls, entry); if (!declExists) { _errorStream.WriteLine($"function definition provided for undeclared member function: \"{entry.ToStringSignature()}\""); Console.WriteLine($"Error: function definition provided for undeclared member function: \"{entry.ToStringSignature()}\""); continue; } } } }
public ClassSymbolTable GetClassSymbolTableByName(string name) { return(ClassSymbolTables.FirstOrDefault(x => string.Equals(x.ClassName, name))); }
public void AddClassSymbolTable(ClassSymbolTable table) { table.Parent = this; ClassSymbolTables.Add(table); }