Exemplo n.º 1
0
        //#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()}\"");
                });
            }
        }
Exemplo n.º 2
0
        //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}");
                }
            }
        }
Exemplo n.º 3
0
        // #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}");
                }
            }
        }
Exemplo n.º 4
0
        // #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;
                    }
                }
            }
        }
Exemplo n.º 5
0
 public ClassSymbolTable GetClassSymbolTableByName(string name)
 {
     return(ClassSymbolTables.FirstOrDefault(x => string.Equals(x.ClassName, name)));
 }
Exemplo n.º 6
0
 public void AddClassSymbolTable(ClassSymbolTable table)
 {
     table.Parent = this;
     ClassSymbolTables.Add(table);
 }