Ejemplo n.º 1
0
        public void Visit(SchemaFromNode node)
        {
            var schema = _provider.GetSchema(node.Schema);

            ISchemaTable table;

            if (_currentScope.Name != "Desc")
            {
                table = schema.GetTableByName(node.Method, _schemaFromArgs.ToArray());
            }
            else
            {
                table = new DynamicTable(new ISchemaColumn[0]);
            }

            _schemaFromArgs.Clear();

            AddAssembly(schema.GetType().Assembly);

            _queryAlias = StringHelpers.CreateAliasIfEmpty(node.Alias, _generatedAliases);
            _generatedAliases.Add(_queryAlias);

            var tableSymbol = new TableSymbol(_queryAlias, schema, table, !string.IsNullOrEmpty(node.Alias));

            _currentScope.ScopeSymbolTable.AddSymbol(_queryAlias, tableSymbol);
            _currentScope[node.Id] = _queryAlias;

            Nodes.Push(new SchemaFromNode(node.Schema, node.Method, (ArgsListNode)Nodes.Pop(), _queryAlias));
        }
Ejemplo n.º 2
0
        private static bool IsApplicable(TableRelation relation, TableSymbol leftTable, TableSymbol rightTable)
        {
            var isParentAndChild = (relation.ParentTable == leftTable && relation.ChildTable == rightTable);
            var isChildAndParent = (relation.ParentTable == rightTable && relation.ChildTable == leftTable);

            return(isParentAndChild || isChildAndParent);
        }
        public void Visit(AliasedFromNode node)
        {
            var schemaInfo = _explicitlyUsedAliases[node.Identifier];
            var tableName  = _explicitlyCoupledTablesWithAliases[node.Identifier];
            var table      = _explicitlyDefinedTables[tableName];

            var schema = _provider.GetSchema(schemaInfo.Schema);

            AddAssembly(schema.GetType().Assembly);

            _queryAlias = StringHelpers.CreateAliasIfEmpty(node.Alias, _generatedAliases);
            _generatedAliases.Add(_queryAlias);

            var tableSymbol = new TableSymbol(_queryAlias, schema, table, !string.IsNullOrEmpty(node.Alias));

            _currentScope.ScopeSymbolTable.AddSymbol(_queryAlias, tableSymbol);
            _currentScope[node.Id] = _queryAlias;

            var aliasedSchemaFromNode = new SchemaFromNode(schemaInfo.Schema, schemaInfo.Method, node.Args, _queryAlias);

            if (!InferredColumns.ContainsKey(aliasedSchemaFromNode))
            {
                InferredColumns.Add(aliasedSchemaFromNode, table.Columns);
            }

            Nodes.Push(aliasedSchemaFromNode);
        }
Ejemplo n.º 4
0
        public static TypeSymbol GetAnyResult(TableSymbol table, IReadOnlyList <Expression> args)
        {
            var columns = new List <ColumnSymbol>();

            var doNotRepeat = new HashSet <ColumnSymbol>(GetSummarizeByColumns(args));

            for (int i = 0; i < args.Count; i++)
            {
                var arg = args[i];

                if (arg is StarExpression)
                {
                    foreach (var c in table.Columns)
                    {
                        if (!doNotRepeat.Contains(c))
                        {
                            columns.Add(c.WithName("any_" + c.Name));
                        }
                    }
                }
                else if (arg.ReferencedSymbol is ColumnSymbol c)
                {
                    columns.Add(c.WithName("any_" + c.Name));
                }
                else
                {
                    var col = new ColumnSymbol(Binding.Binder.GetExpressionResultName(arg, "column"), arg.ResultType);
                    columns.Add(col);
                }
            }

            return(new TupleSymbol(columns));
        }
Ejemplo n.º 5
0
        private void readToken()
        {
            if (token != null && token.Kind == "ID")
            {
                TableSymbol.addSymbol(token, scope);
            }

            token = tokens[controlToken++];
        }
Ejemplo n.º 6
0
        private static TypeSymbol GetArgMinMaxResult(TableSymbol table, IReadOnlyList <Expression> args, string prefix)
        {
            var columns     = new List <ColumnSymbol>();
            var doNotRepeat = new HashSet <ColumnSymbol>(GetSummarizeByColumns(args));

            if (args.Count > 0)
            {
                var primaryArg     = args[0];
                var primaryColName = Binding.Binder.GetExpressionResultName(primaryArg);

                for (int i = 0; i < args.Count; i++)
                {
                    var arg = args[i];

                    if (arg is StarExpression)
                    {
                        foreach (var c in table.Columns)
                        {
                            if (!doNotRepeat.Contains(c))
                            {
                                columns.Add(c);
                            }
                        }
                    }
                    else if (arg.ReferencedSymbol is ColumnSymbol c)
                    {
                        // don't let * repeat this column
                        doNotRepeat.Add(c);

                        // change identity of explicitly referenced columns so won't match same columns already in projection list
                        columns.Add(new ColumnSymbol(c.Name, c.Type));
                    }
                    else
                    {
                        var expName = Binding.Binder.GetExpressionResultName(arg, null);
                        if (expName == null)
                        {
                            if (i == 0)
                            {
                                expName = prefix + "_";
                            }
                            else
                            {
                                expName = prefix + "_" + primaryColName + "_arg" + i;
                            }
                        }

                        var col = new ColumnSymbol(expName, arg.ResultType);
                        columns.Add(col);
                    }
                }
            }

            return(new TupleSymbol(columns));
        }
Ejemplo n.º 7
0
        /// <summary>
        /// <param>   ::= <tipo> id
        /// </summary>
        /// <param name="node"></param>
        /// <returns></returns>
        private object _param(Node node)
        {
            string type = (string)_tipo(node.getIssue(0));
            Token  id   = node.getIssue(1).Token;

            if (TableSymbol.symbols.Exists(x => x.Image == id.Image))
            {
                //TODO:ADD ERRO
            }
            else
            {
                TableSymbol.addSymbol(type, node.Token);
            }
            return(null);
        }
Ejemplo n.º 8
0
        private static TypeSymbol GetArgMinMaxDepResult(TableSymbol table, IReadOnlyList <Expression> args)
        {
            var columns = new List <ColumnSymbol>();

            if (args.Count > 0)
            {
                var primaryArg     = args[0];
                var primaryColName = Binding.Binder.GetExpressionResultName(primaryArg);
                var primaryCol     = new ColumnSymbol(primaryColName, primaryArg.ResultType);
                columns.Add(primaryCol);

                // determine columns in by expression
                var doNotRepeat = new HashSet <ColumnSymbol>(GetSummarizeByColumns(args));

                for (int i = 1; i < args.Count; i++)
                {
                    var arg = args[i];

                    if (arg is StarExpression)
                    {
                        foreach (var c in table.Columns)
                        {
                            if (c != primaryArg.ReferencedSymbol && !doNotRepeat.Contains(c))
                            {
                                columns.Add(c.WithName(primaryColName + "_" + c.Name));
                            }
                        }
                    }
                    else if (arg.ReferencedSymbol is ColumnSymbol c)
                    {
                        columns.Add(c.WithName(primaryColName + "_" + c.Name));
                    }
                    else
                    {
                        var expName = Binding.Binder.GetExpressionResultName(arg, null);
                        if (expName == null)
                        {
                            expName = "arg" + i;
                        }
                        var col = new ColumnSymbol(primaryColName + "_" + expName, arg.ResultType);
                        columns.Add(col);
                    }
                }
            }

            return(new TupleSymbol(columns));
        }
Ejemplo n.º 9
0
        /// <summary>
        /// <func>    ::= <tipo> id '[' <params> ']' '<<' <comans> '>>'
        /// </summary>
        /// <param name="node"></param>
        /// <returns></returns>
        private object _func(Node node)
        {
            string type = (string)_tipo(node.getIssue(0));
            Token  id   = node.getIssue(1).Token;

            if (TableSymbol.getType(id) != null)
            {
                //TODO:ADD ERRO
            }
            else
            {
                TableSymbol.setType(id, type);
                _params(node.getIssue(3));
                _comans(node.getIssue(6));
            }

            return(null);
        }
Ejemplo n.º 10
0
 public void StartAnalyzer()
 {
     while (TableSymbol.HasNextSymbol())
     {
         readSymbol();
         if (isFunctionDefinition(currentSymbol))
         {
             analyzeFunctionSignature();
         }
         else if (currentSymbol.Token == Token.TokenOpenCBrackets)
         {
             currentScope++;
         }
         else if (currentSymbol.Token == Token.TokenCloseCBrackets)
         {
             currentScope--;
         }
         else if (currentScope < 0)
         {
             error("Mau término do escopo. Encontrado '}' a mais");
         }
         else if (isVariableDeclaration(currentSymbol))
         {
             analyzeVariableDeclaration();
         }
         else if (currentSymbol.Token == Token.TokenID)
         {
             analyzeAssignment();
         }
         else if (currentSymbol.Token == Token.TokenKeywordIf || currentSymbol.Token == Token.TokenKeywordWhile)
         {
             analyzeControlStatement();
         }
         else if (currentSymbol.Token == Token.TokenKeywordSwitch)
         {
             analyzeSwitchStatement();
         }
     }
 }
Ejemplo n.º 11
0
        private async Task <IReadOnlyList <TableSymbol> > LoadExternalTablesAsync(string connection, string databaseName, bool throwOnError, CancellationToken cancellationToken)
        {
            var tables = new List <TableSymbol>();

            // get external tables from .show external tables and .show external table xxx cslschema
            var externalTables = await ExecuteControlCommandAsync <ShowExternalTablesResult>(connection, databaseName, ".show external tables", throwOnError, cancellationToken);

            if (externalTables != null)
            {
                foreach (var et in externalTables)
                {
                    var etSchemas = await ExecuteControlCommandAsync <ShowExternalTableSchemaResult>(connection, databaseName, $".show materialized-view {et.TableName} cslschema", throwOnError, cancellationToken);

                    if (etSchemas != null && etSchemas.Length > 0)
                    {
                        var mvSymbol = new TableSymbol(et.TableName, "(" + etSchemas[0].Schema + ")", et.DocString).WithIsExternal(true);
                        tables.Add(mvSymbol);
                    }
                }
            }

            return(tables);
        }
Ejemplo n.º 12
0
        private async Task <IReadOnlyList <TableSymbol> > LoadTablesAsync(string connection, string databaseName, bool throwOnError, CancellationToken cancellationToken)
        {
            var tables = new List <TableSymbol>();

            // get table schema from .show database xxx schema
            var databaseSchemas = await ExecuteControlCommandAsync <ShowDatabaseSchemaResult>(connection, databaseName, $".show database {databaseName} schema", throwOnError, cancellationToken).ConfigureAwait(false);

            if (databaseSchemas == null)
            {
                return(null);
            }

            foreach (var table in databaseSchemas.Where(s => !string.IsNullOrEmpty(s.TableName)).GroupBy(s => s.TableName))
            {
                var tableDocString = table.FirstOrDefault(t => string.IsNullOrEmpty(t.ColumnName) && !string.IsNullOrEmpty(t.DocString))?.DocString;
                var columnSchemas  = table.Where(t => !string.IsNullOrEmpty(t.ColumnName)).ToArray();
                var columns        = columnSchemas.Select(s => new ColumnSymbol(s.ColumnName, GetKustoType(s.ColumnType), s.DocString)).ToList();
                var tableSymbol    = new TableSymbol(table.Key, columns, tableDocString);
                tables.Add(tableSymbol);
            }

            return(tables);
        }
Ejemplo n.º 13
0
        private async Task <IReadOnlyList <TableSymbol> > LoadMaterializedViewsAsync(string connection, string databaseName, bool throwOnError, CancellationToken cancellationToken)
        {
            var tables = new List <TableSymbol>();

            // get materialized views from .show materialized-views and .show materialized-view xxx cslschema
            var materializedViews = await ExecuteControlCommandAsync <ShowMaterializedViewsResult>(connection, databaseName, ".show materialized-views", throwOnError, cancellationToken);

            if (materializedViews != null)
            {
                foreach (var mv in materializedViews)
                {
                    var mvSchemas = await ExecuteControlCommandAsync <ShowMaterializedViewSchemaResult>(connection, databaseName, $".show materialized-view {mv.Name} cslschema", throwOnError, cancellationToken);

                    if (mvSchemas != null && mvSchemas.Length > 0)
                    {
                        var mvSymbol = new TableSymbol(mv.Name, "(" + mvSchemas[0].Schema + ")", mv.DocString).WithIsMaterializedView(true);
                        tables.Add(mvSymbol);
                    }
                }
            }

            return(tables);
        }
Ejemplo n.º 14
0
        static int Main(string[] args)
        {
            switch (args.Length)
            {
            case < 1:
                Console.WriteLine("Erro fatal: Não existe o ficheiro de entrada");
                Console.WriteLine("Uso: DartCompiler <caminho_ficheiro>");
                return(-1);

            case > MAX_ARGS_COUNT:
                Console.WriteLine("Demasiados argumentos");
                Console.WriteLine("Uso: DartCompiler <caminho_ficheiro>");
                return(-1);
            }


            if (args[0] == "-h")
            {
                Console.WriteLine("Mini Compilador de Dart");
                Console.WriteLine("DartCompiler <caminho_ficheiro> --> Compila o ficheiro");
                Console.WriteLine("DartCompiler -h --> Lista os comandos do DartCompiler");
                Console.WriteLine("DartCompiler <código_fonte> -s --> Compila o código fonte e imprime apenas a tabela de símbolos do Scanner");
                Console.WriteLine("DartCompiler <código_fonte> --scanner --> Compila o código fonte e imprime apenas a tabela de símbolos do Scanner");
                return(0);
            }
            string filePath          = args[0];
            bool   showScannerOutput = args.Length == 2 && (args[1] == "-s" || args[1] == "--scanner");

            Scanner scanner;

            try
            {
                scanner = new Scanner(filePath);
            }
            catch (FileNotFoundException e)
            {
                System.Console.WriteLine($"Erro Fatal: Não foi possível encontrar o ficheiro {e.FileName}");
                return(-1);
            }

            while (!scanner.EndOfFile)
            {
                var symbol = scanner.Analex();
                if (symbol.isComment())
                {
                    continue;
                }
                TableSymbol.Insert(symbol);
            }

            if (ErrorList.ExistsErrors())
            {
                ErrorList.PrintErrors();
                return(-1);
            }

            Parser parser = new Parser();

            if (showScannerOutput)
            {
                TableSymbol.PrintTable();
            }
            while (TableSymbol.HasNextSymbol())
            {
                parser.StartParsing(null);
            }

            if (ErrorList.ExistsErrors())
            {
                ErrorList.PrintErrors();
                return(-1);
            }

            TableSymbol.ResetSymbolIndex();
            Semantic semanticAnaliser = new Semantic();

            semanticAnaliser.StartAnalyzer();

            // Imprime os erros encontrados
            if (ErrorList.ExistsErrors())
            {
                ErrorList.PrintErrors();
                return(-1);
            }
            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine("Compilado com sucesso!");
            Console.ResetColor();
            return(0);
        }
Ejemplo n.º 15
0
 public static string GetExpressionResultName(Expression expr, string defaultName = "", TableSymbol rowScope = null)
 {
     return(Binder.GetExpressionResultName(expr, defaultName, rowScope));
 }
Ejemplo n.º 16
0
 private void readSymbol()
 {
     currentSymbol = TableSymbol.GetNextSymbol();
 }
Ejemplo n.º 17
0
 /// <summary>
 /// True if the <see cref="TableSymbol"/> is part of one of the known databases.
 /// </summary>
 public bool IsDatabaseTable(TableSymbol table)
 {
     return(GetDatabase(table) != null);
 }
Ejemplo n.º 18
0
        public void AnalyzeCode(string code)
        {
            code = code.ToLower();
            StringBuilder str    = new StringBuilder();
            int           estate = 0;
            Symbol        symbol;
            bool          literal = false;

            for (int i = 0; i < code.Length; i++)
            {
                while (estate != -1)
                {
                    if (i >= code.Length)
                    {
                        break;
                    }

                    if (char.IsDigit(code[i]))
                    {
                        estate = TransitionTable[estate, GetKeywordColumn('d')];
                    }
                    else if (char.IsLetter(code[i]))
                    {
                        estate = TransitionTable[estate, GetKeywordColumn('l')];
                    }
                    else if (char.IsWhiteSpace(code[i]) && literal == false)
                    {
                        break;
                    }
                    else if (!char.IsLetterOrDigit(code[i]))
                    {
                        if (!char.IsWhiteSpace(code[i]))
                        {
                            estate = TransitionTable[estate, GetKeywordColumn(code[i])];
                            if (code[i] == '\"')
                            {
                                if (literal == false)
                                {
                                    literal = true;
                                }
                                else
                                {
                                    literal = false;
                                }
                            }
                        }
                        if (literal == false && code[i] != '\"')
                        {
                            break;
                        }
                    }
                    if (estate == -1)
                    {
                        break;
                    }

                    str.Append(code[i]);
                    i++;
                }
                double num;
                if (!string.IsNullOrWhiteSpace(str.ToString()))
                {
                    symbol = new Symbol()
                    {
                        Id = TableSymbol.Table.Count + 1, Name = str.ToString()
                    };
                    if (!TableSymbol.ContainsSymbol(symbol))
                    {
                        TableSymbol.AddSymbol(symbol);
                    }
                    if (reservedWords.Contains(symbol.Name))
                    {
                        TableToken.AddToken(new Token()
                        {
                            Id = TableSymbol.GetSymbolId(symbol), Name = symbol.Name, Type = TypeToken.PALAVRA_RESERVADA
                        });
                    }
                    else if (separators.Contains(symbol.Name))
                    {
                        TableToken.AddToken(new Token()
                        {
                            Id = TableSymbol.GetSymbolId(symbol), Name = symbol.Name, Type = TypeToken.SEPARADOR
                        });
                    }
                    else if (operators.Contains(symbol.Name))
                    {
                        TableToken.AddToken(new Token()
                        {
                            Id = TableSymbol.GetSymbolId(symbol), Name = symbol.Name, Type = TypeToken.OPERADOR
                        });
                    }
                    else if (symbol.Name.StartsWith("\\"))
                    {
                        TableToken.AddToken(new Token()
                        {
                            Id = TableSymbol.GetSymbolId(symbol), Name = symbol.Name, Type = TypeToken.COMENTARIO
                        });
                    }
                    else if (symbol.Name.StartsWith("\"") && symbol.Name.EndsWith("\""))
                    {
                        TableToken.AddToken(new Token()
                        {
                            Id = TableSymbol.GetSymbolId(symbol), Name = symbol.Name, Type = TypeToken.LITERAL
                        });
                    }
                    else if (double.TryParse(symbol.Name, out num))
                    {
                        TableToken.AddToken(new Token()
                        {
                            Id = TableSymbol.GetSymbolId(symbol), Name = symbol.Name, Type = TypeToken.NUMERO
                        });
                    }
                    else
                    {
                        TableToken.AddToken(new Token()
                        {
                            Id = TableSymbol.GetSymbolId(symbol), Name = symbol.Name, Type = TypeToken.IDENTIFICADOR
                        });
                    }
                }
                str    = new StringBuilder();
                estate = 0;
            }
        }
Ejemplo n.º 19
0
        public LexicalAnalyzer()
        {
            TableToken.ClearTable();
            TableSymbol.ClearTable();

            TableSymbol.AddSymbol(new Symbol {
                Id = 1, Name = "algoritmo"
            });
            TableSymbol.AddSymbol(new Symbol {
                Id = 2, Name = "var"
            });
            TableSymbol.AddSymbol(new Symbol {
                Id = 3, Name = "inicio"
            });
            TableSymbol.AddSymbol(new Symbol {
                Id = 4, Name = "fimalgoritmo"
            });
            TableSymbol.AddSymbol(new Symbol {
                Id = 5, Name = "inteiro"
            });
            TableSymbol.AddSymbol(new Symbol {
                Id = 6, Name = "real"
            });
            TableSymbol.AddSymbol(new Symbol {
                Id = 7, Name = "caractere"
            });
            TableSymbol.AddSymbol(new Symbol {
                Id = 8, Name = "logico"
            });
            TableSymbol.AddSymbol(new Symbol {
                Id = 9, Name = "vetor"
            });
            TableSymbol.AddSymbol(new Symbol {
                Id = 10, Name = "escreval"
            });
            TableSymbol.AddSymbol(new Symbol {
                Id = 11, Name = "leia"
            });
            TableSymbol.AddSymbol(new Symbol {
                Id = 12, Name = "para"
            });
            TableSymbol.AddSymbol(new Symbol {
                Id = 13, Name = "de"
            });
            TableSymbol.AddSymbol(new Symbol {
                Id = 14, Name = "ate"
            });
            TableSymbol.AddSymbol(new Symbol {
                Id = 15, Name = "faca"
            });
            TableSymbol.AddSymbol(new Symbol {
                Id = 16, Name = "fimpara"
            });
            TableSymbol.AddSymbol(new Symbol {
                Id = 17, Name = "se"
            });
            TableSymbol.AddSymbol(new Symbol {
                Id = 18, Name = "senao"
            });
            TableSymbol.AddSymbol(new Symbol {
                Id = 19, Name = "fimse"
            });
            TableSymbol.AddSymbol(new Symbol {
                Id = 19, Name = "entao"
            });
        }
Ejemplo n.º 20
0
 /// <summary>
 /// Gets the <see cref="DatabaseSymbol"/> that contains the <see cref="TableSymbol"/>.
 /// </summary>
 public DatabaseSymbol GetDatabase(TableSymbol table)
 {
     return(GetDatabase((Symbol)table));
 }
 public TableSymbol AddToUniverse(TableSymbol symbol)
 {
     universeScope.Add(symbol.value, symbol);
     return(symbol);
 }
Ejemplo n.º 22
0
 protected void readNextSymbol()
 {
     symbol = TableSymbol.GetNextSymbol();
 }
 public TableSymbol Add(TableSymbol symbol)
 {
     symbolTable.Peek().Add(symbol.value, symbol);
     return(symbol);
 }
Ejemplo n.º 24
0
        public static void generarC3D(ParseTree arbol, Errores errores)
        {
            GeneradorAST migenerador = new GeneradorAST(arbol);
            AST          ast         = migenerador.miarbol;
            Entorno      ent         = new Entorno(null, "GLOBAL", "GLOBAL");

            if (ast != null)
            {
                //Primera pasada: solo funciones y structs
                foreach (Instruccion element in ast.instrucciones)
                {
                    if (element is FunctionSt || element is StructSt)
                    {
                        element.compilar(ent, errores);
                    }
                }

                //Segunda pasada: Solo declaraciones
                foreach (Instruccion element in ast.instrucciones)
                {
                    if (element is Declaracion || element is DeclaConstante)
                    {
                        element.compilar(ent, errores);
                    }
                }
                string declaraciones = Generator.getInstance().getCode() + "\n"; //obtengo las declaraciones antes para guardarlos en los entornos antes de todo

                //Tercera pasada: Solo funciones (genera codigo);
                foreach (Instruccion element in ast.instrucciones)
                {
                    if (element is FunctionSt)
                    {
                        element.compilar(ent, errores);
                    }
                }
                string funciones = Generator.getInstance().getCode(); //obtengo las funciones no nativas

                //Cuarta pasada: Las instrucciones que van dentro del main
                foreach (Instruccion element in ast.instrucciones)
                {
                    if (!(element is FunctionSt || element is StructSt || element is Declaracion || element is DeclaConstante))
                    {
                        element.compilar(ent, errores);
                    }
                }
                //GENERAMOS C3D
                string codigo = Generator.getInstance().getEncabezado();
                codigo            += Generator.getInstance().getFuncionesNativas();
                codigo            += funciones;
                codigo            += Generator.getInstance().getOpenMain();
                codigo            += declaraciones;
                codigo            += Generator.getInstance().getCode();
                codigo            += Generator.getInstance().getCloseMain();
                Form1.consola.Text = codigo;
                Generator.getInstance().clearCode();
                TableSymbol tabla = new TableSymbol();
                tabla.generarTablaSimbolos(ent);
            }
            else
            {
                MessageBox.Show("Error generando mi AST", "Errores", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }