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)); }
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); }
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)); }
private void readToken() { if (token != null && token.Kind == "ID") { TableSymbol.addSymbol(token, scope); } token = tokens[controlToken++]; }
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)); }
/// <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); }
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)); }
/// <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); }
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(); } } }
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); }
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); }
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); }
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); }
public static string GetExpressionResultName(Expression expr, string defaultName = "", TableSymbol rowScope = null) { return(Binder.GetExpressionResultName(expr, defaultName, rowScope)); }
private void readSymbol() { currentSymbol = TableSymbol.GetNextSymbol(); }
/// <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); }
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; } }
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" }); }
/// <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); }
protected void readNextSymbol() { symbol = TableSymbol.GetNextSymbol(); }
public TableSymbol Add(TableSymbol symbol) { symbolTable.Peek().Add(symbol.value, symbol); return(symbol); }
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); } }