Example #1
0
        public CodePart Compile(ParseTree tree, Context context, CompilerOptions options)
        {
            _part = new CodePart();
            _context = context;
            _options = options;

            try
            {
                if (tree.Nodes.Count > 0)
                {
                    PreProcess(tree);
                    CompileProgram(tree);
                }
            }
            catch (Exception e)
            {
                if (_lastNode != null)
                {
                    throw new Exception(string.Format("Error parsing {0}: {1}", ConcatenateNodes(_lastNode), e.Message));
                }
                else
                {
                    throw;
                }
            }

            return _part;
        }
Example #2
0
        public CodePart Compile(int startLineNum, ParseTree tree, Context context, CompilerOptions options)
        {
            InitCompileFlags();

            part = new CodePart();
            this.context = context;
            this.options = options;
            this.startLineNum = startLineNum;

            ++context.NumCompilesSoFar;

            try
            {
                if (tree.Nodes.Count > 0)
                {
                    PreProcess(tree);
                    CompileProgram(tree);
                }
            }
            catch (KOSException kosException)
            {
                if (lastNode != null)
                {
                    throw;  // TODO something more sophisticated will go here that will
                    // attach source/line information to the exception before throwing it upward.
                    // that's why this seemingly pointless "catch and then throw again" is here.
                }
                SafeHouse.Logger.Log("Exception in Compiler: " + kosException.Message);
                SafeHouse.Logger.Log(kosException.StackTrace);
                throw;  // throw it up in addition to logging the stack trace, so the kOS terminal will also give the user some message.
            }

            return part;
        }
Example #3
0
		protected override void TranslateAssignment(List<string> output, ParseTree.Assignment assignment)
		{
			output.Add(this.CurrentTabIndention);
			Expression target = assignment.Target;

			if (target is Variable && ((Variable)target).IsStatic)
			{
				output.Add("public static ");
			}

			Annotation typeAnnotation = target.GetAnnotation("type");

			if (typeAnnotation != null)
			{
				string type = this.JavaPlatform.GetTypeStringFromAnnotation(
					typeAnnotation.FirstToken, 
					typeAnnotation.GetSingleArgAsString(null), 
					false, false);
				output.Add(type);
				output.Add(" ");
			}

			this.TranslateExpression(output, target);
			output.Add(" ");
			output.Add(assignment.AssignmentOp);
			output.Add(" ");
			this.TranslateExpression(output, assignment.Value);
			output.Add(";");
			output.Add(this.NL);
		}
Example #4
0
        protected override object EvalAttribute(ParseTree tree, params object[] paramlist)
        {
            Grammar grammar = (Grammar)paramlist[0];
            Symbol symbol = (Symbol)paramlist[1];
            GrammarNode node = (GrammarNode)paramlist[2];

            if (symbol.Attributes.ContainsKey(node.Nodes[1].Token.Text))
            {
                tree.Errors.Add(new ParseError("Attribute already defined for this symbol: " + node.Nodes[1].Token.Text, 0x1039, node.Nodes[1]));
                return null;
            }

            symbol.Attributes.Add(node.Nodes[1].Token.Text, (object[])EvalParams(tree, new object[] { node }));
            switch (node.Nodes[1].Token.Text)
            {
                case "Skip":
                    if (symbol is TerminalSymbol)
                        grammar.SkipSymbols.Add(symbol);
                    else
                        tree.Errors.Add(new ParseError("Attribute for non-terminal rule not allowed: " + node.Nodes[1].Token.Text, 0x1035, node));
                    break;
                case "Color":
                    if (symbol is NonTerminalSymbol)
                        tree.Errors.Add(new ParseError("Attribute for non-terminal rule not allowed: " + node.Nodes[1].Token.Text, 0x1035, node));

                    if (symbol.Attributes["Color"].Length != 1 && symbol.Attributes["Color"].Length != 3)
                        tree.Errors.Add(new ParseError("Attribute " + node.Nodes[1].Token.Text + " has too many or missing parameters", 0x103A, node.Nodes[1]));

                    for (int i = 0; i < symbol.Attributes["Color"].Length; i++)
                    {
                        if (symbol.Attributes["Color"][i] is string)
                        {
                            tree.Errors.Add(new ParseError("Parameter " + node.Nodes[3].Nodes[i * 2].Nodes[0].Token.Text + " is of incorrect type", 0x103A, node.Nodes[3].Nodes[i * 2].Nodes[0]));
                            break;
                        }
                    }
                    break;
                case "IgnoreCase":
                    if (!(symbol is TerminalSymbol))
                        tree.Errors.Add(new ParseError("Attribute for non-terminal rule not allowed: " + node.Nodes[1].Token.Text, 0x1035, node));
                    break;
                case "FileAndLine":
                    if (symbol is TerminalSymbol)
                    {
                        grammar.SkipSymbols.Add(symbol);
                        grammar.FileAndLine = symbol;
                    }
                    else
                        tree.Errors.Add(new ParseError("Attribute for non-terminal rule not allowed: " + node.Nodes[1].Token.Text, 0x1035, node));
                    break;
                default:
                    tree.Errors.Add(new ParseError("Attribute not supported: " + node.Nodes[1].Token.Text, 0x1036, node.Nodes[1]));
                    break;
            }

            return symbol;
        }
		protected override void X_ImageBlit(List<string> output, ParseTree.Expression screen, ParseTree.Expression image, ParseTree.Expression x, ParseTree.Expression y)
		{
			output.Add("$gfx_blit_image(");
			SerializeExpression(output, image);
			output.Add(", $floor(");
			SerializeExpression(output, x);
			output.Add("), $floor(");
			SerializeExpression(output, y);
			output.Add("))");
		}
Example #6
0
        public ParseTree Parse(string input, string fileName, ParseTree tree)
        {
            scanner.Init(input, fileName);

            this.tree = tree;
            ParseStart(tree);
            tree.Skipped = scanner.Skipped;

            return tree;
        }
Example #7
0
        private void CompileProgram(ParseTree tree)
        {
            _currentCodeSection = _part.MainCode;
            PushProgramParameters();
            VisitNode(tree.Nodes[0]);

            if (_addBranchDestination)
            {
                AddOpcode(new OpcodeNOP());
            }
        }
Example #8
0
		protected override void TranslateFunctionDefinition(List<string> output, ParseTree.FunctionDefinition functionDef)
		{
			output.Add(this.CurrentTabIndention);

			string returnType = "void*";
			Annotation returnTypeAnnotation = functionDef.GetAnnotation("type");
			if (returnTypeAnnotation != null)
			{
				returnType = this.CPlatform.GetTypeStringFromAnnotation(new AnnotatedType(returnTypeAnnotation), false, true);
			}
			output.Add(returnType);
			output.Add(" ");
			output.Add("v_" + functionDef.NameToken.Value);
			output.Add("(");
			for (int i = 0; i < functionDef.ArgNames.Length; ++i)
			{
				if (i > 0) output.Add(", ");
				if (functionDef.ArgAnnotations[i] == null)
				{
					output.Add("object ");
				}
				else
				{
					string argType = functionDef.ArgAnnotations[i].GetSingleArgAsString(null);
					string type = this.CPlatform.GetTypeStringFromAnnotation(functionDef.ArgAnnotations[i].FirstToken, argType, false, true);
					output.Add(type);
					output.Add(" ");
				}
				output.Add("v_" + functionDef.ArgNames[i].Value);
			}
			output.Add(")");
			output.Add(this.NL);
			output.Add(this.CurrentTabIndention);
			output.Add("{");
			output.Add(this.NL);
			this.CurrentIndention++;

			Executable[] code = functionDef.Code;
			if (functionDef.GetAnnotation("omitReturn") != null)
			{
				Executable[] newCode = new Executable[code.Length - 1];
				Array.Copy(code, newCode, newCode.Length);
				code = newCode;
			}
			this.Translate(output, code);

			this.CurrentIndention--;
			output.Add(this.CurrentTabIndention);
			output.Add("}");
			//*/
			output.Add(this.NL);
		}
Example #9
0
 public override ParseTree Parse(Lexer lexer, ParserState state)
 {
     ParseTree bodyTree = body.Parse(lexer, state);
     
     if (bodyTree == ParseTree.No)
         return ParseTree.No;
     
     ParseTree labelledTree = new ParseTree();
     labelledTree = labelledTree.ExtendFields(bodyTree);
     labelledTree.Fields[label] = bodyTree.Value;
     
     return labelledTree;
 }
Example #10
0
        private void AssembleGraph(BidirectionalGraph<ParseTree, Edge<ParseTree>> graph, ParseTree parent)
        {
            if (parent.Children == null)
            {
                return;
            }

            foreach (var child in parent.Children)
            {
                graph.AddVertex(child);
                graph.AddEdge(new Edge<ParseTree>(parent, child));
                AssembleGraph(graph, child);
            }
        }
Example #11
0
 protected override object EvalAssignmentExpression(ParseTree tree, params object[] paramlist)
 {
     object result = this.GetValue(tree, TokenType.ConditionalOrExpression, 0);
     if (nodes.Count >= 5 && result is bool
         && nodes[1].Token.Type == TokenType.QUESTIONMARK
         && nodes[3].Token.Type == TokenType.COLON)
     {
         if (Convert.ToBoolean(result))
             result = nodes[2].Eval(tree, paramlist); // return 1st argument
         else
             result = nodes[4].Eval(tree, paramlist); // return 2nd argumen
     }
     return result;
 }
Example #12
0
        protected override object EvalAdditiveExpression(ParseTree tree, params object[] paramlist)
        {
            object result = this.GetValue(tree, TokenType.MultiplicativeExpression, 0);
            for (int i = 1; i < nodes.Count; i += 2)
            {
                Token token = nodes[i].Token;
                object val = nodes[i + 1].Eval(tree, paramlist);
                if (token.Type == TokenType.PLUS)
                    result = Convert.ToDouble(result) + Convert.ToDouble(val);
                else if (token.Type == TokenType.MINUS)
                    result = Convert.ToDouble(result) - Convert.ToDouble(val);
            }

            return result;
        }
 public void AllowNestedOutputAtEachLevel()
 {
     var tree = new ParseTree("<system goal>");
     tree.AddTerminalChild("begin");
     tree.AddChildNode(BuildStatementNode());
     tree.AddTerminalChild("end");
     tree.BuildLinesDifferently();
     Assert.AreEqual("<system goal>", tree.Lines[0]);
     Assert.AreEqual("begin <statement> end ", tree.Lines[1]);
     Assert.AreEqual("begin Id := <expression> ; end ", tree.Lines[2]);
     Assert.AreEqual("begin Id := <primary> <add op> <expression> ; end ", tree.Lines[3]);
     Assert.AreEqual("begin Id := Id <add op> <expression> ; end ", tree.Lines[4]);
     Assert.AreEqual("begin Id := Id PlusOp <expression> ; end ", tree.Lines[5]);
     Assert.AreEqual("begin Id := Id PlusOp <primary> ; end ", tree.Lines[6]);
     Assert.AreEqual("begin Id := Id PlusOp IdX ; end ", tree.Lines[7]);
 }
Example #14
0
        public CodePart Compile(int startLineNum, ParseTree tree, Context context, CompilerOptions options)
        {
            InitCompileFlags();

            part = new CodePart();
            this.context = context;
            this.options = options;
            this.startLineNum = startLineNum;

            ++context.NumCompilesSoFar;

            if (tree.Nodes.Count > 0)
            {
                PreProcess(tree);
                CompileProgram(tree);
            }
            return part;
        }
Example #15
0
        public static void Populate(TreeView treeview, ParseTree parsetree)
        {
            treeview.Visible = false;
            treeview.SuspendLayout();
            treeview.Nodes.Clear();
            treeview.Tag = parsetree;

            ParseNode start = parsetree.Nodes[0];
            TreeNode node = new TreeNode(start.Text);
            node.Tag = start;
            node.ForeColor = Color.SteelBlue;
            treeview.Nodes.Add(node);

            PopulateNode(node, start);
            treeview.ExpandAll();
            treeview.ResumeLayout();
            treeview.Visible = true;
        }
 protected override void X_DrawRectangle(List<string> output, ParseTree.Expression screen, ParseTree.Expression left, ParseTree.Expression top, ParseTree.Expression width, ParseTree.Expression height, ParseTree.Expression red, ParseTree.Expression green, ParseTree.Expression blue)
 {
     output.Add("$gfx_draw_rectangle(");
     SerializeExpression(output, left);
     output.Add(", ");
     SerializeExpression(output, top);
     output.Add(", ");
     SerializeExpression(output, width);
     output.Add(", ");
     SerializeExpression(output, height);
     output.Add(", ");
     SerializeExpression(output, red);
     output.Add(", ");
     SerializeExpression(output, green);
     output.Add(", ");
     SerializeExpression(output, blue);
     output.Add(", 255)");
 }
Example #17
0
 public void ExtendingFields()
 {
     ParseTree a = new ParseTree();
     a.Fields["a"] = "A";
     a.Fields["b"] = "B";
     a.Fields["c"] = "C";
     
     Assert.IsTrue(a.Fields.ContainsKey("a"));
     Assert.IsTrue(a.Fields.ContainsKey("b"));
     Assert.IsTrue(a.Fields.ContainsKey("c"));
     
     ParseTree b = new ParseTree();
     b.ExtendFields(a);
     b.Fields["d"] = "D";
     
     Assert.IsTrue(b.Fields.ContainsKey("a"));
     Assert.IsTrue(b.Fields.ContainsKey("b"));
     Assert.IsTrue(b.Fields.ContainsKey("c"));
     Assert.IsTrue(b.Fields.ContainsKey("d"));
 }
		protected override void X_DrawRectangle(List<string> output, ParseTree.Expression screen, ParseTree.Expression left, ParseTree.Expression top, ParseTree.Expression width, ParseTree.Expression height, ParseTree.Expression red, ParseTree.Expression green, ParseTree.Expression blue)
		{
			// TODO: need to run this through a helper function to avoid 1-height bugs
			output.Add("pygame.draw.rect(");
			SerializeExpression(output, screen);
			output.Add(", (");
			SerializeExpression(output, red);
			output.Add(", ");
			SerializeExpression(output, green);
			output.Add(", ");
			SerializeExpression(output, blue);
			output.Add("), pygame.Rect(");
			SerializeExpression(output, left);
			output.Add(", ");
			SerializeExpression(output, top);
			output.Add(", ");
			SerializeExpression(output, width);
			output.Add(", ");
			SerializeExpression(output, height);
			output.Add("))");
		}
Example #19
0
		protected override void TranslateFunctionDefinition(List<string> output, ParseTree.FunctionDefinition functionDef)
		{
			Annotation returnType = functionDef.GetAnnotation("type");
			string type = returnType == null ? "Object" : this.JavaPlatform.GetTypeStringFromString(returnType.GetSingleArgAsString(null), false, false);

			output.Add(this.CurrentTabIndention);
			output.Add("public static ");
			output.Add(type);
			output.Add(" v_");
			output.Add(functionDef.NameToken.Value);
			output.Add("(");
			for (int i = 0; i < functionDef.ArgNames.Length; ++i)
			{
				if (i > 0) {
					output.Add(", ");
				}
				Annotation annotation = functionDef.ArgAnnotations[i];
				string argType = annotation == null ? "Object" : annotation.GetSingleArgAsString(null);
				output.Add(this.JavaPlatform.GetTypeStringFromString(argType, false, false));
				output.Add(" v_");
				output.Add(functionDef.ArgNames[i].Value);
			}
			output.Add(") {");
			output.Add(this.NL);

			this.CurrentIndention++;
			Executable[] code = functionDef.Code;
			if (functionDef.GetAnnotation("omitReturn") != null)
			{
				Executable[] newCode = new Executable[code.Length - 1];
				Array.Copy(code, newCode, newCode.Length);
				code = newCode;
			}
			this.Translate(output, code);
			this.CurrentIndention--;

			output.Add(this.CurrentTabIndention);
			output.Add("}");
			output.Add(this.NL);
		}
Example #20
0
 public override ParseTree Parse(Lexer lexer, ParserState state)
 {
     state.RuntimeState.Runtime.ParseTrace.Enter(this, lexer.CurrentSource(), "token");
     
     int start = lexer.Position;
     
     ParseTree bodyTree = body.Parse(lexer, state);
     
     if (bodyTree == ParseTree.No)
     {
         state.RuntimeState.Runtime.ParseTrace.No(this, lexer.SourceFrom(start));
         return ParseTree.No;
     }
     
     state.RuntimeState.Runtime.ParseTrace.Yes(this, lexer.SourceFrom(start));
     
     ParseTree tokenTree = new ParseTree(
         lexer.Text.Substring(start, lexer.Position - start));
     
     tokenTree = tokenTree.ExtendFields(bodyTree);
     
     return tokenTree;
 }
Example #21
0
 public ViewData(ParseTree tree)
 {
     this.Tree = tree;
     NotColoredTokens.AddRange(tree.Tokens);
 }
 public void Initialize()
 {
     tree = new ParseTree();
 }
Example #23
0
 public Additive(ParseTree term, ParseTree prime)
 {
     this.Term  = term;
     this.Prime = prime;
 }
Example #24
0
 private void PreProcess(ParseTree tree)
 {
     ParseNode rootNode = tree.Nodes[0];
     LowercaseConversions(rootNode);
     RearrangeParseNodes(rootNode);
     TraverseScopeBranch(rootNode);
     IterateUserFunctions(rootNode, IdentifyUserFunctions);
     PreProcessStatements(rootNode);
     IterateUserFunctions(rootNode, PreProcessUserFunctionStatement);
 }
        public void Analizar(String entrada)
        {
            GramaticaCQL  gramatica = new GramaticaCQL();
            LanguageData  lenguaje  = new LanguageData(gramatica);
            Parser        parser    = new Parser(lenguaje);
            ParseTree     arbol     = parser.Parse(entrada);
            ParseTreeNode raiz      = arbol.Root;

            Estatico.errores  = new List <ErrorCQL>();
            Estatico.mensajes = new List <String>();
            Estatico.servidor = new Servidor();
            obteErroes(arbol);


            if (raiz != null)
            {
                Graficador.Graficador grafo = new Graficador.Graficador();
                grafo.graficar(raiz);
                ConstruirAST constructor = new ConstruirAST(raiz);
                AST          arbolAst    = constructor.generarAst();
                Entorno      ent         = new Entorno(null);

                //-------- Prueba;
                BaseDatos prueba = new BaseDatos("prueba");
                Estatico.servidor.nuevaBase("prueba", prueba);
                Usuario admin = new Usuario("admin", "admin");
                Estatico.actualUsuario = admin;

                foreach (NodoAST sentencia in arbolAst.arbol)
                {
                    if (sentencia is Instruccion)
                    {
                        if (sentencia is Funcion)
                        {
                            Funcion fun = (Funcion)sentencia;

                            ent.agregar(fun.identificador, fun);
                        }
                    }
                    else if (sentencia is Expresion)
                    {
                    }
                }

                foreach (NodoAST sentencia in arbolAst.arbol)
                {
                    if (sentencia is Instruccion)
                    {
                        if (!(sentencia is Funcion))
                        {
                            Instruccion ins   = (Instruccion)sentencia;
                            object      valor = ins.ejecutar(ent);
                        }
                    }
                    else if (sentencia is Expresion)
                    {
                        Expresion exp   = (Expresion)sentencia;
                        object    valor = exp.getValor(ent);
                    }
                }

                //por el momento modificar al final


                ReporteErrores reporte = new ReporteErrores(Estatico.errores);
                reporte.writeReport();
            }
            else
            {
                Estatico.agregarMensaje("[+MESSAGE]raiz nula[-MESSAGE]");
                //MessageBox.Show("raiznula");
            }
        }
Example #26
0
        private void runButton_Click(object sender, EventArgs e)
        {
            resultadoAnalisis = null;
            resultadoAnalisis = SintacticoInterprete.Analizar(code_textbox.Text);
            error_table.Rows.Clear();
            symbol_table.Rows.Clear();
            console_textbox.Text = "";

            if (resultadoAnalisis != null)
            {
                if (resultadoAnalisis.ParserMessages.Count == 0)
                {
                    SemanticoInterprete semanticoInterprete = new SemanticoInterprete();
                    semanticoInterprete.iniciarAnalisisSintactico(resultadoAnalisis.Root);
                    Simbolo sim;
                    String  valorTabla = "";
                    if (semanticoInterprete.errores.Count != 0)
                    {
                        table_label.Text     = "Error Table";
                        symbol_table.Visible = false;
                        error_table.Visible  = true;
                        foreach (Error error in semanticoInterprete.errores)
                        {
                            error_table.Rows.Add("Semantico", error.error, error.fila + 1, error.columna + 1);
                        }
                    }
                    else
                    {
                        table_label.Text     = "Symbol Table";
                        symbol_table.Visible = true;
                        error_table.Visible  = false;
                        foreach (Entorno entorno in semanticoInterprete.entornos)
                        {
                            foreach (KeyValuePair <string, Simbolo> variable in entorno.tabla)
                            {
                                if (typeof(Objeto).IsInstanceOfType(variable.Value.valor))
                                {
                                    string valor = "";
                                    if (((Objeto)variable.Value.valor).arreglo is null)
                                    {
                                        foreach (KeyValuePair <string, Simbolo> parametro in ((Objeto)variable.Value.valor).parametros)
                                        {
                                            sim = parametro.Value;
                                            if (sim.valor.ToString().Contains("Proyecto1_Compiladores2"))
                                            {
                                                valorTabla = ((Objeto)sim.valor).nombre;
                                                if (valor == "")
                                                {
                                                    valor = parametro.Key + ": " + valorTabla;
                                                }
                                                else
                                                {
                                                    valor += ", " + parametro.Key + ": " + valorTabla;
                                                }
                                            }
                                            else
                                            {
                                                if (valor == "")
                                                {
                                                    valor = parametro.Key + ": " + sim.valor;
                                                }
                                                else
                                                {
                                                    valor += ", " + parametro.Key + ": " + sim.valor;
                                                }
                                            }
                                        }
                                    }
                                    else
                                    {
                                        Objeto tmp = (Objeto)variable.Value.valor;
                                        if (tmp.tipo != Simbolo.EnumTipo.objeto)
                                        {
                                            valor = tmp.tipo + "[" + tmp.arreglo.GetLength(0);
                                        }
                                        else
                                        {
                                            valor = tmp.nombreTipo + "[" + tmp.arreglo.GetLength(0);
                                        }
                                        for (int i = 1; i < tmp.arreglo.Rank; i++)
                                        {
                                            valor += ", " + tmp.arreglo.GetLength(i);
                                        }
                                        valor += "]";
                                    }
                                    symbol_table.Rows.Add(variable.Key, variable.Value.tipo, entorno.nombreEntorno, variable.Value.fila, variable.Value.columna, valor);
                                }
                                else
                                {
                                    if (variable.Value.tipo == Simbolo.EnumTipo.funcion || variable.Value.tipo == Simbolo.EnumTipo.procedimiento)
                                    {
                                        SubPrograma sp    = (SubPrograma)variable.Value.valor;
                                        string      valor = "";
                                        if (sp.ordenParametros.Count != 0)
                                        {
                                            foreach (string cadena in sp.ordenParametros)
                                            {
                                                if (valor == "")
                                                {
                                                    valor = "; {" + cadena;
                                                }
                                                else
                                                {
                                                    valor += ", " + cadena;
                                                }
                                            }
                                            valor += "}";
                                        }
                                        symbol_table.Rows.Add(variable.Key, variable.Value.tipo, entorno.nombreEntorno, variable.Value.fila, variable.Value.columna, sp.tipo + valor);
                                    }
                                    else
                                    {
                                        symbol_table.Rows.Add(variable.Key, variable.Value.tipo, entorno.nombreEntorno, variable.Value.fila, variable.Value.columna, variable.Value.valor.ToString());
                                    }
                                }
                            }
                        }
                    }
                    foreach (string texto in semanticoInterprete.consola)
                    {
                        if (texto.Contains("\n"))
                        {
                            console_textbox.Text += texto.Replace("\n", "") + Environment.NewLine;
                        }
                        else
                        {
                            console_textbox.Text += texto;
                        }
                    }

                    //Graficar Arbol Irony
                    SintacticoInterprete.crearImagen(resultadoAnalisis.Root, null, 0);

                    /*Thread.Sleep(1000);
                     * var p = new Process();
                     *
                     * //Abrir imagen Irony
                     * p.StartInfo = new ProcessStartInfo(@"C:\compiladores2\ArbolIrony.png")
                     * {
                     *  UseShellExecute = true
                     * };
                     * p.Start();*/
                }
                else
                {
                    table_label.Text     = "Error Table";
                    symbol_table.Visible = false;
                    error_table.Visible  = true;

                    string mensajeTraducido = "";

                    foreach (Irony.LogMessage error in resultadoAnalisis.ParserMessages)
                    {
                        if (error.Message.Contains("expected"))
                        {
                            mensajeTraducido = error.Message.Replace("Syntax error, expected: ", "Se esperaba el token: ");
                        }
                        else
                        {
                            mensajeTraducido = "No se encontro simbolo para finalizar la cadena";
                        }
                        error_table.Rows.Add("Sintactico", mensajeTraducido, error.Location.Line + 1, error.Location.Column + 1);
                    }
                }
            }
            else
            {
            }
        }
        public void ParseTreeCreateArgumentExceptioNumberInsteadOfOperatorTest()
        {
            var tree = new ParseTree("( 4 ( + 4 4 ) 4");

            tree.Result();
        }
        public void ParseTreeResultBigTest()
        {
            var tree = new ParseTree("( ^ ( * ( + ( - 8 6 ) ( * 3 ( / 120 10 ) ) 4 ) 2 )");

            Assert.AreEqual(23104, tree.Result());
        }
Example #29
0
 public GeneradorAST(ParseTree arbol)
 {
     arbolirony = arbol;
     generar(arbolirony.Root);
 }
        public void ParseTreeNegativeErectionTest()
        {
            var tree = new ParseTree("( ^ ( + 7 8 ) ( - 3 5 )");

            tree.Result();
        }
        public void ParseTreeMoreNumberWithoutOperandTest()
        {
            var tree = new ParseTree("( * ( + 1 1 2 ) 2 )");

            tree.Result();
        }
 public void ParseTreeForgettingSpaceTest()
 {
     var tree = new ParseTree("( * (+ 7 8 ) 8 )");
 }
 public void ParseTreeBadSymbolsInStringInOperandTest()
 {
     var tree = new ParseTree("( * ( * o 8 ) 8 )");
 }
        public void ParseTreeBadSymbolsInStringInOperatorTest()
        {
            var tree = new ParseTree("( * ( i 7 8 ) 8 )");

            tree.Result();
        }
        public void ParseTreeResultTest()
        {
            var tree = new ParseTree("( * ( + 1 1 ) 2 )");

            Assert.AreEqual(4, tree.Result());
        }
 private void ProcessCompoundKeywordWithError(ITokenList tokenList, ParseTree sqlTree, XmlElement currentContainerElement, ref int tokenID, List<int> significantTokenPositions, int keywordCount)
 {
     ProcessCompoundKeyword(tokenList, sqlTree, currentContainerElement, ref tokenID, significantTokenPositions, keywordCount);
     sqlTree.ErrorFound = true;
 }
Example #37
0
 public Unparser(ParseTree tree) => Tree = tree ?? throw new ArgumentNullException(nameof(tree));
Example #38
0
        private void CompileProgram(ParseTree tree)
        {
            currentCodeSection = part.MainCode;

            PushReversedParameters();
            VisitNode(tree.Nodes[0]);

            if (addBranchDestination || currentCodeSection.Count == 0)
            {
                AddOpcode(new OpcodeNOP());
            }
        }
Example #39
0
 public AdditivePrime(string op, ParseTree term, ParseTree prime)
 {
     this.Operator = op;
     this.Term     = term;
     this.Prime    = prime;
 }
        public void ParseTreeResultDivideByZeroTest()
        {
            var tree = new ParseTree("( / ( * 2 4 ) ( - 2 2 ) )");

            tree.Result();
        }
Example #41
0
 public JavaPackage?TryParse(string text, out ParseTree parseTree)
 {
     return(TryParse(text, null, out parseTree));
 }
Example #42
0
 public ParseTree Parse(string input)
 {
     tree = new ParseTree();
     return Parse(input, tree);
 }
Example #43
0
            /*
             * { StatementList }
             * or
             * { }
             * returns List<MoccaSuite>
             */
            public virtual object EvalBlock(ParseTree tree, params object[] paramlist)
            {
                List <MoccaSuite> ret = (List <MoccaSuite>) this.GetValue(tree, TokenType.StatementList, 0);

                return(ret);
            }
Example #44
0
 /*
  * ( Param )
  * returns List<object>
  */
 public virtual object EvalParams(ParseTree tree, params object[] paramlist)
 {
     return(this.GetValue(tree, TokenType.Param, 0));
 }
        public XmlDocument ParseSQL(ITokenList tokenList)
        {
            ParseTree sqlTree = new ParseTree(SqlXmlConstants.ENAME_SQL_ROOT);
            sqlTree.ErrorFound = tokenList.HasErrors;
            sqlTree.StartNewStatement();

            int tokenCount = tokenList.Count;
            int tokenID = 0;
            while (tokenID < tokenCount)
            {
                IToken token = tokenList[tokenID];

                switch (token.Type)
                {
                    case SqlTokenType.OpenParens:
                        XmlElement firstNonCommentParensSibling = sqlTree.GetFirstNonWhitespaceNonCommentChildElement(sqlTree.CurrentContainer);
                        bool isInsertOrValuesClause = (
                            firstNonCommentParensSibling != null
                            && (
                                (firstNonCommentParensSibling.Name.Equals(SqlXmlConstants.ENAME_OTHERKEYWORD)
                                   && firstNonCommentParensSibling.InnerText.ToUpperInvariant().StartsWith("INSERT")
                                   )
                                ||
                                (firstNonCommentParensSibling.Name.Equals(SqlXmlConstants.ENAME_COMPOUNDKEYWORD)
                                   && firstNonCommentParensSibling.GetAttribute(SqlXmlConstants.ANAME_SIMPLETEXT).ToUpperInvariant().StartsWith("INSERT ")
                                   )
                                ||
                                (firstNonCommentParensSibling.Name.Equals(SqlXmlConstants.ENAME_OTHERKEYWORD)
                                   && firstNonCommentParensSibling.InnerText.ToUpperInvariant().StartsWith("VALUES")
                                   )
                               )
                            );

                        if (sqlTree.CurrentContainer.Name.Equals(SqlXmlConstants.ENAME_CTE_ALIAS)
                            && sqlTree.CurrentContainer.ParentNode.Name.Equals(SqlXmlConstants.ENAME_CTE_WITH_CLAUSE)
                            )
                            sqlTree.CurrentContainer = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_DDL_PARENS, "");
                        else if (sqlTree.CurrentContainer.Name.Equals(SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT)
                            && sqlTree.CurrentContainer.ParentNode.Name.Equals(SqlXmlConstants.ENAME_CTE_AS_BLOCK)
                            )
                            sqlTree.CurrentContainer = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_SELECTIONTARGET_PARENS, "");
                        else if (firstNonCommentParensSibling == null
                            && sqlTree.CurrentContainer.Name.Equals(SqlXmlConstants.ENAME_SELECTIONTARGET)
                            )
                            sqlTree.CurrentContainer = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_SELECTIONTARGET_PARENS, "");
                        else if (firstNonCommentParensSibling != null
                            && firstNonCommentParensSibling.Name.Equals(SqlXmlConstants.ENAME_SET_OPERATOR_CLAUSE)
                            )
                        {
                            sqlTree.ConsiderStartingNewClause();
                            sqlTree.CurrentContainer = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_SELECTIONTARGET_PARENS, "");
                        }
                        else if (IsLatestTokenADDLDetailValue(sqlTree))
                            sqlTree.CurrentContainer = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_DDLDETAIL_PARENS, "");
                        else if (sqlTree.CurrentContainer.Name.Equals(SqlXmlConstants.ENAME_DDL_PROCEDURAL_BLOCK)
                            || sqlTree.CurrentContainer.Name.Equals(SqlXmlConstants.ENAME_DDL_OTHER_BLOCK)
                            || isInsertOrValuesClause
                            )
                            sqlTree.CurrentContainer = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_DDL_PARENS, "");
                        else if (IsLatestTokenAMiscName(sqlTree.CurrentContainer))
                            sqlTree.CurrentContainer = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_FUNCTION_PARENS, "");
                        else
                            sqlTree.CurrentContainer = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_EXPRESSION_PARENS, "");
                        break;

                    case SqlTokenType.CloseParens:
                        //we're not likely to actually have a "SingleStatement" in parens, but
                        // we definitely want the side-effects (all the lower-level escapes)
                        sqlTree.EscapeAnySingleOrPartialStatementContainers();

                        //check whether we expected to end the parens...
                        if (sqlTree.CurrentContainer.Name.Equals(SqlXmlConstants.ENAME_DDLDETAIL_PARENS)
                            || sqlTree.CurrentContainer.Name.Equals(SqlXmlConstants.ENAME_DDL_PARENS)
                            || sqlTree.CurrentContainer.Name.Equals(SqlXmlConstants.ENAME_FUNCTION_PARENS)
                            || sqlTree.CurrentContainer.Name.Equals(SqlXmlConstants.ENAME_EXPRESSION_PARENS)
                            || sqlTree.CurrentContainer.Name.Equals(SqlXmlConstants.ENAME_SELECTIONTARGET_PARENS)
                            )
                        {
                            sqlTree.MoveToAncestorContainer(1); //unspecified parent node...
                        }
                        else if (sqlTree.CurrentContainer.Name.Equals(SqlXmlConstants.ENAME_SQL_CLAUSE)
                                && sqlTree.CurrentContainer.ParentNode.Name.Equals(SqlXmlConstants.ENAME_SELECTIONTARGET_PARENS)
                                && sqlTree.CurrentContainer.ParentNode.ParentNode.Name.Equals(SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT)
                                && sqlTree.CurrentContainer.ParentNode.ParentNode.ParentNode.Name.Equals(SqlXmlConstants.ENAME_CTE_AS_BLOCK)
                                )
                        {
                            sqlTree.MoveToAncestorContainer(4, SqlXmlConstants.ENAME_CTE_WITH_CLAUSE);
                            sqlTree.CurrentContainer = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT, "");
                        }
                        else if (sqlTree.CurrentContainer.Name.Equals(SqlXmlConstants.ENAME_SQL_CLAUSE)
                                && (
                                    sqlTree.CurrentContainer.ParentNode.Name.Equals(SqlXmlConstants.ENAME_EXPRESSION_PARENS)
                                    || sqlTree.CurrentContainer.ParentNode.Name.Equals(SqlXmlConstants.ENAME_SELECTIONTARGET_PARENS)
                                )
                            )
                        {
                            sqlTree.MoveToAncestorContainer(2); //unspecified grandfather node.
                        }
                        else
                        {
                            sqlTree.SaveNewElementWithError(SqlXmlConstants.ENAME_OTHERNODE, ")");
                        }
                        break;

                    case SqlTokenType.OtherNode:

                        //prepare multi-keyword detection by "peeking" up to 7 keywords ahead
                        List<int> significantTokenPositions = GetSignificantTokenPositions(tokenList, tokenID, 7);
                        string significantTokensString = ExtractTokensString(tokenList, significantTokenPositions);

                        if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_PERMISSIONS_DETAIL))
                        {
                            //if we're in a permissions detail clause, we can expect all sorts of statements
                            // starters and should ignore them all; the only possible keywords to escape are
                            // "ON" and "TO".
                            if (significantTokensString.StartsWith("ON "))
                            {
                                sqlTree.MoveToAncestorContainer(1, SqlXmlConstants.ENAME_PERMISSIONS_BLOCK);
                                sqlTree.StartNewContainer(SqlXmlConstants.ENAME_PERMISSIONS_TARGET, token.Value, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT);
                            }
                            else if (significantTokensString.StartsWith("TO ")
                                || significantTokensString.StartsWith("FROM ")
                                )
                            {
                                sqlTree.MoveToAncestorContainer(1, SqlXmlConstants.ENAME_PERMISSIONS_BLOCK);
                                sqlTree.StartNewContainer(SqlXmlConstants.ENAME_PERMISSIONS_RECIPIENT, token.Value, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT);
                            }
                            else
                            {
                                //default to "some classification of permission"
                                sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value);
                            }
                        }
                        else if (significantTokensString.StartsWith("CREATE PROC")
                            || significantTokensString.StartsWith("CREATE FUNC")
                            || significantTokensString.StartsWith("CREATE TRIGGER ")
                            || significantTokensString.StartsWith("CREATE VIEW ")
                            || significantTokensString.StartsWith("ALTER PROC")
                            || significantTokensString.StartsWith("ALTER FUNC")
                            || significantTokensString.StartsWith("ALTER TRIGGER ")
                            || significantTokensString.StartsWith("ALTER VIEW ")
                            )
                        {
                            sqlTree.ConsiderStartingNewStatement();
                            sqlTree.CurrentContainer = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_DDL_PROCEDURAL_BLOCK, "");
                            sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value);
                        }
                        else if (_CursorDetector.IsMatch(significantTokensString))
                        {
                            sqlTree.ConsiderStartingNewStatement();
                            sqlTree.CurrentContainer = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_CURSOR_DECLARATION, "");
                            sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value);
                        }
                        else if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_DDL_PROCEDURAL_BLOCK)
                            && _TriggerConditionDetector.IsMatch(significantTokensString)
                            )
                        {
                            //horrible complicated forward-search, to avoid having to keep a different "Trigger Condition" state for Update, Insert and Delete statement-starting keywords
                            Match triggerConditions = _TriggerConditionDetector.Match(significantTokensString);
                            sqlTree.CurrentContainer = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_TRIGGER_CONDITION, "");
                            XmlElement triggerConditionType = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_COMPOUNDKEYWORD, "");

                            //first set the "trigger condition type": FOR, INSTEAD OF, AFTER
                            string triggerConditionTypeSimpleText = triggerConditions.Groups[1].Value;
                            triggerConditionType.SetAttribute(SqlXmlConstants.ANAME_SIMPLETEXT, triggerConditionTypeSimpleText);
                            int triggerConditionTypeNodeCount = triggerConditionTypeSimpleText.Split(new char[] { ' ' }).Length; //there's probably a better way of counting words...
                            AppendNodesWithMapping(sqlTree, tokenList.GetRangeByIndex(significantTokenPositions[0], significantTokenPositions[triggerConditionTypeNodeCount - 1]), SqlXmlConstants.ENAME_OTHERKEYWORD, triggerConditionType);

                            //then get the count of conditions (INSERT, UPDATE, DELETE) and add those too...
                            int triggerConditionNodeCount = triggerConditions.Groups[2].Value.Split(new char[] { ' ' }).Length - 2; //there's probably a better way of counting words...
                            AppendNodesWithMapping(sqlTree, tokenList.GetRangeByIndex(significantTokenPositions[triggerConditionTypeNodeCount - 1] + 1, significantTokenPositions[triggerConditionTypeNodeCount + triggerConditionNodeCount - 1]), SqlXmlConstants.ENAME_OTHERKEYWORD, sqlTree.CurrentContainer);
                            tokenID = significantTokenPositions[triggerConditionTypeNodeCount + triggerConditionNodeCount - 1];
                            sqlTree.MoveToAncestorContainer(1, SqlXmlConstants.ENAME_DDL_PROCEDURAL_BLOCK);
                        }
                        else if (significantTokensString.StartsWith("FOR "))
                        {
                            sqlTree.EscapeAnyBetweenConditions();
                            sqlTree.EscapeAnySelectionTarget();
                            sqlTree.EscapeJoinCondition();

                            if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_CURSOR_DECLARATION))
                            {
                                sqlTree.StartNewContainer(SqlXmlConstants.ENAME_CURSOR_FOR_BLOCK, token.Value, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT);
                                sqlTree.StartNewStatement();
                            }
                            else if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_SQL_CLAUSE)
                                && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_SQL_STATEMENT)
                                && sqlTree.PathNameMatches(2, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT)
                                && sqlTree.PathNameMatches(3, SqlXmlConstants.ENAME_CURSOR_FOR_BLOCK)
                                )
                            {
                                sqlTree.MoveToAncestorContainer(4, SqlXmlConstants.ENAME_CURSOR_DECLARATION);
                                sqlTree.StartNewContainer(SqlXmlConstants.ENAME_CURSOR_FOR_OPTIONS, token.Value, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT);
                            }
                            else
                            {
                                //Assume FOR clause if we're at clause level
                                // (otherwise, eg in OPTIMIZE FOR UNKNOWN, this will just not do anything)
                                sqlTree.ConsiderStartingNewClause();

                                sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value);
                            }
                        }
                        else if (significantTokensString.StartsWith("CREATE ")
                            || significantTokensString.StartsWith("ALTER ")
                            || significantTokensString.StartsWith("DECLARE ")
                            )
                        {
                            sqlTree.ConsiderStartingNewStatement();
                            sqlTree.CurrentContainer = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_DDL_OTHER_BLOCK, "");
                            sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value);
                        }
                        else if (significantTokensString.StartsWith("GRANT ")
                            || significantTokensString.StartsWith("DENY ")
                            || significantTokensString.StartsWith("REVOKE ")
                            )
                        {
                            if (significantTokensString.StartsWith("GRANT ")
                                && sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT)
                                && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_DDL_WITH_CLAUSE)
                                && sqlTree.PathNameMatches(2, SqlXmlConstants.ENAME_PERMISSIONS_BLOCK)
                                && sqlTree.GetFirstNonWhitespaceNonCommentChildElement(sqlTree.CurrentContainer) == null
                                )
                            {
                                //this MUST be a "WITH GRANT OPTION" option...
                                sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value);
                            }
                            else
                            {
                                sqlTree.ConsiderStartingNewStatement();
                                sqlTree.StartNewContainer(SqlXmlConstants.ENAME_PERMISSIONS_BLOCK, token.Value, SqlXmlConstants.ENAME_PERMISSIONS_DETAIL);
                            }
                        }
                        else if (sqlTree.CurrentContainer.Name.Equals(SqlXmlConstants.ENAME_DDL_PROCEDURAL_BLOCK)
                            && significantTokensString.StartsWith("RETURNS ")
                            )
                        {
                            sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value, sqlTree.SaveNewElement(SqlXmlConstants.ENAME_DDL_RETURNS, ""));
                        }
                        else if (significantTokensString.StartsWith("AS "))
                        {
                            if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_DDL_PROCEDURAL_BLOCK))
                            {
                                KeywordType nextKeywordType;
                                bool isDataTypeDefinition = false;
                                if (significantTokenPositions.Count > 1
                                    && KeywordList.TryGetValue(tokenList[significantTokenPositions[1]].Value, out nextKeywordType)
                                    )
                                    if (nextKeywordType == KeywordType.DataTypeKeyword)
                                        isDataTypeDefinition = true;

                                if (isDataTypeDefinition)
                                {
                                    //this is actually a data type declaration (redundant "AS"...), save as regular token.
                                    sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value);
                                }
                                else
                                {
                                    //this is the start of the object content definition
                                    sqlTree.StartNewContainer(SqlXmlConstants.ENAME_DDL_AS_BLOCK, token.Value, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT);
                                    sqlTree.StartNewStatement();
                                }
                            }
                            else if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT)
                                && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_DDL_WITH_CLAUSE)
                                && sqlTree.PathNameMatches(2, SqlXmlConstants.ENAME_DDL_PROCEDURAL_BLOCK)
                                )
                            {
                                sqlTree.MoveToAncestorContainer(2, SqlXmlConstants.ENAME_DDL_PROCEDURAL_BLOCK);
                                sqlTree.StartNewContainer(SqlXmlConstants.ENAME_DDL_AS_BLOCK, token.Value, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT);
                                sqlTree.StartNewStatement();
                            }
                            else if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_CTE_ALIAS)
                                && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_CTE_WITH_CLAUSE)
                                )
                            {
                                sqlTree.MoveToAncestorContainer(1, SqlXmlConstants.ENAME_CTE_WITH_CLAUSE);
                                sqlTree.StartNewContainer(SqlXmlConstants.ENAME_CTE_AS_BLOCK, token.Value, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT);
                            }
                            else
                            {
                                sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value);
                            }
                        }
                        else if (significantTokensString.StartsWith("BEGIN DISTRIBUTED TRANSACTION ")
                            || significantTokensString.StartsWith("BEGIN DISTRIBUTED TRAN ")
                            )
                        {
                            sqlTree.ConsiderStartingNewStatement();
                            ProcessCompoundKeyword(tokenList, sqlTree, sqlTree.SaveNewElement(SqlXmlConstants.ENAME_BEGIN_TRANSACTION, ""), ref tokenID, significantTokenPositions, 3);
                        }
                        else if (significantTokensString.StartsWith("BEGIN TRANSACTION ")
                            || significantTokensString.StartsWith("BEGIN TRAN ")
                            )
                        {
                            sqlTree.ConsiderStartingNewStatement();
                            ProcessCompoundKeyword(tokenList, sqlTree, sqlTree.SaveNewElement(SqlXmlConstants.ENAME_BEGIN_TRANSACTION, ""), ref tokenID, significantTokenPositions, 2);
                        }
                        else if (significantTokensString.StartsWith("SAVE TRANSACTION ")
                            || significantTokensString.StartsWith("SAVE TRAN ")
                            )
                        {
                            sqlTree.ConsiderStartingNewStatement();
                            ProcessCompoundKeyword(tokenList, sqlTree, sqlTree.SaveNewElement(SqlXmlConstants.ENAME_SAVE_TRANSACTION, ""), ref tokenID, significantTokenPositions, 2);
                        }
                        else if (significantTokensString.StartsWith("COMMIT TRANSACTION ")
                            || significantTokensString.StartsWith("COMMIT TRAN ")
                            || significantTokensString.StartsWith("COMMIT WORK ")
                            )
                        {
                            sqlTree.ConsiderStartingNewStatement();
                            ProcessCompoundKeyword(tokenList, sqlTree, sqlTree.SaveNewElement(SqlXmlConstants.ENAME_COMMIT_TRANSACTION, ""), ref tokenID, significantTokenPositions, 2);
                        }
                        else if (significantTokensString.StartsWith("COMMIT "))
                        {
                            sqlTree.ConsiderStartingNewStatement();
                            sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value, sqlTree.SaveNewElement(SqlXmlConstants.ENAME_COMMIT_TRANSACTION, token.Value));
                        }
                        else if (significantTokensString.StartsWith("ROLLBACK TRANSACTION ")
                            || significantTokensString.StartsWith("ROLLBACK TRAN ")
                            || significantTokensString.StartsWith("ROLLBACK WORK ")
                            )
                        {
                            sqlTree.ConsiderStartingNewStatement();
                            ProcessCompoundKeyword(tokenList, sqlTree, sqlTree.SaveNewElement(SqlXmlConstants.ENAME_ROLLBACK_TRANSACTION, ""), ref tokenID, significantTokenPositions, 2);
                        }
                        else if (significantTokensString.StartsWith("ROLLBACK "))
                        {
                            sqlTree.ConsiderStartingNewStatement();
                            sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value, sqlTree.SaveNewElement(SqlXmlConstants.ENAME_ROLLBACK_TRANSACTION, token.Value));
                        }
                        else if (significantTokensString.StartsWith("BEGIN TRY "))
                        {
                            sqlTree.ConsiderStartingNewStatement();
                            XmlElement newTryBlock = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_TRY_BLOCK, "");
                            XmlElement tryContainerOpen = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_CONTAINER_OPEN, "", newTryBlock);
                            ProcessCompoundKeyword(tokenList, sqlTree, tryContainerOpen, ref tokenID, significantTokenPositions, 2);
                            XmlElement tryMultiContainer = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_CONTAINER_MULTISTATEMENT, "", newTryBlock);
                            sqlTree.StartNewStatement(tryMultiContainer);
                        }
                        else if (significantTokensString.StartsWith("BEGIN CATCH "))
                        {
                            sqlTree.ConsiderStartingNewStatement();
                            XmlElement newCatchBlock = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_CATCH_BLOCK, "");
                            XmlElement catchContainerOpen = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_CONTAINER_OPEN, "", newCatchBlock);
                            ProcessCompoundKeyword(tokenList, sqlTree, catchContainerOpen, ref tokenID, significantTokenPositions, 2);
                            XmlElement catchMultiContainer = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_CONTAINER_MULTISTATEMENT, "", newCatchBlock);
                            sqlTree.StartNewStatement(catchMultiContainer);
                        }
                        else if (significantTokensString.StartsWith("BEGIN "))
                        {
                            sqlTree.ConsiderStartingNewStatement();
                            sqlTree.StartNewContainer(SqlXmlConstants.ENAME_BEGIN_END_BLOCK, token.Value, SqlXmlConstants.ENAME_CONTAINER_MULTISTATEMENT);
                            sqlTree.StartNewStatement();
                        }
                        else if (significantTokensString.StartsWith("MERGE "))
                        {
                            //According to BOL, MERGE is a fully reserved keyword from compat 100 onwards, for the MERGE statement only.
                            sqlTree.ConsiderStartingNewStatement();
                            sqlTree.ConsiderStartingNewClause();
                            sqlTree.StartNewContainer(SqlXmlConstants.ENAME_MERGE_CLAUSE, token.Value, SqlXmlConstants.ENAME_MERGE_TARGET);
                        }
                        else if (significantTokensString.StartsWith("USING "))
                        {
                            if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_MERGE_TARGET))
                            {
                                sqlTree.MoveToAncestorContainer(1, SqlXmlConstants.ENAME_MERGE_CLAUSE);
                                sqlTree.StartNewContainer(SqlXmlConstants.ENAME_MERGE_USING, token.Value, SqlXmlConstants.ENAME_SELECTIONTARGET);
                            }
                            else
                                sqlTree.SaveNewElementWithError(SqlXmlConstants.ENAME_OTHERNODE, token.Value);
                        }
                        else if (significantTokensString.StartsWith("ON "))
                        {
                            sqlTree.EscapeAnySelectionTarget();

                            if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_MERGE_USING))
                            {
                                sqlTree.MoveToAncestorContainer(1, SqlXmlConstants.ENAME_MERGE_CLAUSE);
                                sqlTree.StartNewContainer(SqlXmlConstants.ENAME_MERGE_CONDITION, token.Value, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT);
                            }
                            else if (!sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_DDL_PROCEDURAL_BLOCK)
                                && !sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_DDL_OTHER_BLOCK)
                                && !sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_DDL_WITH_CLAUSE)
                                && !sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_EXPRESSION_PARENS)
                                && !ContentStartsWithKeyword(sqlTree.CurrentContainer, "SET")
                                )
                            {
                                sqlTree.StartNewContainer(SqlXmlConstants.ENAME_JOIN_ON_SECTION, token.Value, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT);
                            }
                            else
                            {
                                sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value);
                            }
                        }
                        else if (significantTokensString.StartsWith("CASE "))
                        {
                            sqlTree.StartNewContainer(SqlXmlConstants.ENAME_CASE_STATEMENT, token.Value, SqlXmlConstants.ENAME_CASE_INPUT);
                        }
                        else if (significantTokensString.StartsWith("WHEN "))
                        {
                            sqlTree.EscapeMergeAction();

                            if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_CASE_INPUT)
                                || (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT)
                                    && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_CASE_THEN)
                                    )
                                )
                            {
                                if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_CASE_INPUT))
                                    sqlTree.MoveToAncestorContainer(1, SqlXmlConstants.ENAME_CASE_STATEMENT);
                                else
                                    sqlTree.MoveToAncestorContainer(3, SqlXmlConstants.ENAME_CASE_STATEMENT);

                                sqlTree.StartNewContainer(SqlXmlConstants.ENAME_CASE_WHEN, token.Value, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT);
                            }
                            else if ((sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT)
                                    && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_MERGE_CONDITION)
                                    )
                                || sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_MERGE_WHEN)
                                )
                            {
                                if (sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_MERGE_CONDITION))
                                    sqlTree.MoveToAncestorContainer(2, SqlXmlConstants.ENAME_MERGE_CLAUSE);
                                else
                                    sqlTree.MoveToAncestorContainer(1, SqlXmlConstants.ENAME_MERGE_CLAUSE);

                                sqlTree.StartNewContainer(SqlXmlConstants.ENAME_MERGE_WHEN, token.Value, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT);
                            }
                            else
                                sqlTree.SaveNewElementWithError(SqlXmlConstants.ENAME_OTHERNODE, token.Value);
                        }
                        else if (significantTokensString.StartsWith("THEN "))
                        {
                            sqlTree.EscapeAnyBetweenConditions();

                            if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT)
                                && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_CASE_WHEN)
                                )
                            {
                                sqlTree.MoveToAncestorContainer(1, SqlXmlConstants.ENAME_CASE_WHEN);
                                sqlTree.StartNewContainer(SqlXmlConstants.ENAME_CASE_THEN, token.Value, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT);
                            }
                            else if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT)
                                && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_MERGE_WHEN)
                                )
                            {
                                sqlTree.MoveToAncestorContainer(1, SqlXmlConstants.ENAME_MERGE_WHEN);
                                sqlTree.StartNewContainer(SqlXmlConstants.ENAME_MERGE_THEN, token.Value, SqlXmlConstants.ENAME_MERGE_ACTION);
                                sqlTree.StartNewStatement();
                            }
                            else
                                sqlTree.SaveNewElementWithError(SqlXmlConstants.ENAME_OTHERNODE, token.Value);
                        }
                        else if (significantTokensString.StartsWith("OUTPUT "))
                        {
                            bool isSprocArgument = false;

                            //We're looking for sproc calls - they can't be nested inside anything else (as far as I know)
                            if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_SQL_CLAUSE)
                                && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_SQL_STATEMENT)
                                && (ContentStartsWithKeyword(sqlTree.CurrentContainer, "EXEC")
                                    || ContentStartsWithKeyword(sqlTree.CurrentContainer, "EXECUTE")
                                    || ContentStartsWithKeyword(sqlTree.CurrentContainer, null)
                                    )
                                )
                            {
                                isSprocArgument = true;
                            }

                            if (!isSprocArgument)
                            {
                                sqlTree.EscapeMergeAction();
                                sqlTree.ConsiderStartingNewClause();
                            }

                            sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value);
                        }
                        else if (significantTokensString.StartsWith("OPTION "))
                        {
                            if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT)
                                && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_DDL_WITH_CLAUSE)
                                )
                            {
                                //"OPTION" keyword here is NOT indicative of a new clause.
                            }
                            else
                            {
                                sqlTree.EscapeMergeAction();
                                sqlTree.ConsiderStartingNewClause();
                            }
                            sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value);
                        }
                        else if (significantTokensString.StartsWith("END TRY "))
                        {
                            sqlTree.EscapeAnySingleOrPartialStatementContainers();

                            if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_SQL_CLAUSE)
                                && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_SQL_STATEMENT)
                                && sqlTree.PathNameMatches(2, SqlXmlConstants.ENAME_CONTAINER_MULTISTATEMENT)
                                && sqlTree.PathNameMatches(3, SqlXmlConstants.ENAME_TRY_BLOCK)
                                )
                            {
                                //clause.statement.multicontainer.try
                                XmlElement tryBlock = (XmlElement)sqlTree.CurrentContainer.ParentNode.ParentNode.ParentNode;
                                XmlElement tryContainerClose = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_CONTAINER_CLOSE, "", tryBlock);
                                ProcessCompoundKeyword(tokenList, sqlTree, tryContainerClose, ref tokenID, significantTokenPositions, 2);
                                sqlTree.CurrentContainer = (XmlElement)tryBlock.ParentNode;
                            }
                            else
                            {
                                ProcessCompoundKeywordWithError(tokenList, sqlTree, sqlTree.CurrentContainer, ref tokenID, significantTokenPositions, 2);
                            }
                        }
                        else if (significantTokensString.StartsWith("END CATCH "))
                        {
                            sqlTree.EscapeAnySingleOrPartialStatementContainers();

                            if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_SQL_CLAUSE)
                                && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_SQL_STATEMENT)
                                && sqlTree.PathNameMatches(2, SqlXmlConstants.ENAME_CONTAINER_MULTISTATEMENT)
                                && sqlTree.PathNameMatches(3, SqlXmlConstants.ENAME_CATCH_BLOCK)
                                )
                            {
                                //clause.statement.multicontainer.catch
                                XmlElement catchBlock = (XmlElement)sqlTree.CurrentContainer.ParentNode.ParentNode.ParentNode;
                                XmlElement catchContainerClose = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_CONTAINER_CLOSE, "", catchBlock);
                                ProcessCompoundKeyword(tokenList, sqlTree, catchContainerClose, ref tokenID, significantTokenPositions, 2);
                                sqlTree.CurrentContainer = (XmlElement)catchBlock.ParentNode;
                            }
                            else
                            {
                                ProcessCompoundKeywordWithError(tokenList, sqlTree, sqlTree.CurrentContainer, ref tokenID, significantTokenPositions, 2);
                            }
                        }
                        else if (significantTokensString.StartsWith("END "))
                        {
                            if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT)
                                && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_CASE_THEN)
                                )
                            {
                                sqlTree.MoveToAncestorContainer(3, SqlXmlConstants.ENAME_CASE_STATEMENT);
                                sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value, sqlTree.SaveNewElement(SqlXmlConstants.ENAME_CONTAINER_CLOSE, ""));
                                sqlTree.MoveToAncestorContainer(1); //unnamed container
                            }
                            else if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT)
                                && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_CASE_ELSE)
                                )
                            {
                                sqlTree.MoveToAncestorContainer(2, SqlXmlConstants.ENAME_CASE_STATEMENT);
                                sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value, sqlTree.SaveNewElement(SqlXmlConstants.ENAME_CONTAINER_CLOSE, ""));
                                sqlTree.MoveToAncestorContainer(1); //unnamed container
                            }
                            else
                            {
                                //Begin/End block handling
                                sqlTree.EscapeAnySingleOrPartialStatementContainers();

                                if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_SQL_CLAUSE)
                                    && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_SQL_STATEMENT)
                                    && sqlTree.PathNameMatches(2, SqlXmlConstants.ENAME_CONTAINER_MULTISTATEMENT)
                                    && sqlTree.PathNameMatches(3, SqlXmlConstants.ENAME_BEGIN_END_BLOCK)
                                    )
                                {
                                    XmlElement beginBlock = (XmlElement)sqlTree.CurrentContainer.ParentNode.ParentNode.ParentNode;
                                    XmlElement beginContainerClose = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_CONTAINER_CLOSE, "", beginBlock);
                                    sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value, beginContainerClose);
                                    sqlTree.CurrentContainer = (XmlElement)beginBlock.ParentNode;
                                }
                                else
                                {
                                    sqlTree.SaveNewElementWithError(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value);
                                }
                            }
                        }
                        else if (significantTokensString.StartsWith("GO "))
                        {
                            sqlTree.EscapeAnySingleOrPartialStatementContainers();

                            if ((tokenID == 0 || IsLineBreakingWhiteSpaceOrComment(tokenList[tokenID - 1]))
                                && IsFollowedByLineBreakingWhiteSpaceOrSingleLineCommentOrEnd(tokenList, tokenID)
                                )
                            {
                                // we found a batch separator - were we supposed to?
                                if (sqlTree.FindValidBatchEnd())
                                {
                                    XmlElement sqlRoot = sqlTree.DocumentElement;
                                    XmlElement batchSeparator = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_BATCH_SEPARATOR, "", sqlRoot);
                                    sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value, batchSeparator);
                                    sqlTree.StartNewStatement(sqlRoot);
                                }
                                else
                                {
                                    sqlTree.SaveNewElementWithError(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value);
                                }
                            }
                            else
                            {
                                sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value);
                            }
                        }
                        else if (significantTokensString.StartsWith("EXECUTE AS "))
                        {
                            bool executeAsInWithOptions = false;
                            if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT)
                                && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_DDL_WITH_CLAUSE)
                                && (IsLatestTokenAComma(sqlTree)
                                    || !sqlTree.HasNonWhiteSpaceNonCommentContent(sqlTree.CurrentContainer)
                                    )
                                )
                                executeAsInWithOptions = true;

                            if (!executeAsInWithOptions)
                            {
                                sqlTree.ConsiderStartingNewStatement();
                                sqlTree.ConsiderStartingNewClause();
                            }

                            ProcessCompoundKeyword(tokenList, sqlTree, sqlTree.CurrentContainer, ref tokenID, significantTokenPositions, 2);
                        }
                        else if (significantTokensString.StartsWith("EXEC ")
                            || significantTokensString.StartsWith("EXECUTE ")
                            )
                        {
                            bool execShouldntTryToStartNewStatement = false;

                            if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_SQL_CLAUSE)
                                && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_SQL_STATEMENT)
                                && (ContentStartsWithKeyword(sqlTree.CurrentContainer, "INSERT")
                                    || ContentStartsWithKeyword(sqlTree.CurrentContainer, "INSERT INTO")
                                    )
                                )
                            {
                                int existingClauseCount = sqlTree.CurrentContainer.SelectNodes(string.Format("../{0}", SqlXmlConstants.ENAME_SQL_CLAUSE)).Count;
                                if (existingClauseCount == 1)
                                    execShouldntTryToStartNewStatement = true;
                            }

                            if (!execShouldntTryToStartNewStatement)
                                sqlTree.ConsiderStartingNewStatement();

                            sqlTree.ConsiderStartingNewClause();

                            sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value);
                        }
                        else if (_JoinDetector.IsMatch(significantTokensString))
                        {
                            sqlTree.ConsiderStartingNewClause();
                            string joinText = _JoinDetector.Match(significantTokensString).Value;
                            int targetKeywordCount = joinText.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Length;
                            ProcessCompoundKeyword(tokenList, sqlTree, sqlTree.CurrentContainer, ref tokenID, significantTokenPositions, targetKeywordCount);
                            sqlTree.CurrentContainer = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_SELECTIONTARGET, "");
                        }
                        else if (significantTokensString.StartsWith("UNION ALL "))
                        {
                            sqlTree.ConsiderStartingNewClause();
                            ProcessCompoundKeyword(tokenList, sqlTree, sqlTree.SaveNewElement(SqlXmlConstants.ENAME_SET_OPERATOR_CLAUSE, ""), ref tokenID, significantTokenPositions, 2);
                        }
                        else if (significantTokensString.StartsWith("UNION ")
                            || significantTokensString.StartsWith("INTERSECT ")
                            || significantTokensString.StartsWith("EXCEPT ")
                            )
                        {
                            sqlTree.ConsiderStartingNewClause();
                            XmlElement unionClause = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_SET_OPERATOR_CLAUSE, "");
                            sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value, unionClause);
                        }
                        else if (significantTokensString.StartsWith("WHILE "))
                        {
                            sqlTree.ConsiderStartingNewStatement();
                            XmlElement newWhileLoop = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_WHILE_LOOP, "");
                            XmlElement whileContainerOpen = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_CONTAINER_OPEN, "", newWhileLoop);
                            sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value, whileContainerOpen);
                            sqlTree.CurrentContainer = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_BOOLEAN_EXPRESSION, "", newWhileLoop);
                        }
                        else if (significantTokensString.StartsWith("IF "))
                        {
                            sqlTree.ConsiderStartingNewStatement();
                            sqlTree.StartNewContainer(SqlXmlConstants.ENAME_IF_STATEMENT, token.Value, SqlXmlConstants.ENAME_BOOLEAN_EXPRESSION);
                        }
                        else if (significantTokensString.StartsWith("ELSE "))
                        {
                            sqlTree.EscapeAnyBetweenConditions();
                            sqlTree.EscapeAnySelectionTarget();
                            sqlTree.EscapeJoinCondition();

                            if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT)
                                && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_CASE_THEN)
                                )
                            {
                                sqlTree.MoveToAncestorContainer(3, SqlXmlConstants.ENAME_CASE_STATEMENT);
                                sqlTree.StartNewContainer(SqlXmlConstants.ENAME_CASE_ELSE, token.Value, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT);
                            }
                            else
                            {
                                sqlTree.EscapePartialStatementContainers();

                                if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_SQL_CLAUSE)
                                    && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_SQL_STATEMENT)
                                    && sqlTree.PathNameMatches(2, SqlXmlConstants.ENAME_CONTAINER_SINGLESTATEMENT)
                                    )
                                {
                                    //we need to pop up the single-statement containers stack to the next "if" that doesn't have an "else" (if any; else error).
                                    // LOCAL SEARCH - we're not actually changing the "CurrentContainer" until we decide to start a statement.
                                    XmlElement currentNode = (XmlElement)sqlTree.CurrentContainer.ParentNode.ParentNode;
                                    bool stopSearching = false;
                                    while (!stopSearching)
                                    {
                                        if (sqlTree.PathNameMatches(currentNode, 1, SqlXmlConstants.ENAME_IF_STATEMENT))
                                        {
                                            //if this is in an "If", then the "Else" must still be available - yay!
                                            sqlTree.CurrentContainer = (XmlElement)currentNode.ParentNode;
                                            sqlTree.StartNewContainer(SqlXmlConstants.ENAME_ELSE_CLAUSE, token.Value, SqlXmlConstants.ENAME_CONTAINER_SINGLESTATEMENT);
                                            sqlTree.StartNewStatement();
                                            stopSearching = true;
                                        }
                                        else if (sqlTree.PathNameMatches(currentNode, 1, SqlXmlConstants.ENAME_ELSE_CLAUSE))
                                        {
                                            //If this is in an "Else", we should skip its parent "IF" altogether, and go to the next singlestatementcontainer candidate.
                                            //singlestatementcontainer.else.if.clause.statement.NEWCANDIDATE
                                            currentNode = (XmlElement)currentNode.ParentNode.ParentNode.ParentNode.ParentNode.ParentNode;
                                        }
                                        else if (sqlTree.PathNameMatches(currentNode, 1, SqlXmlConstants.ENAME_WHILE_LOOP))
                                        {
                                            //If this is in a "While", we should skip to the next singlestatementcontainer candidate.
                                            //singlestatementcontainer.while.clause.statement.NEWCANDIDATE
                                            currentNode = (XmlElement)currentNode.ParentNode.ParentNode.ParentNode.ParentNode;
                                        }
                                        else
                                        {
                                            //if this isn't a known single-statement container, then we're lost.
                                            sqlTree.SaveNewElementWithError(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value);
                                            stopSearching = true;
                                        }
                                    }
                                }
                                else
                                {
                                    sqlTree.SaveNewElementWithError(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value);
                                }
                            }
                        }
                        else if (significantTokensString.StartsWith("INSERT INTO "))
                        {
                            sqlTree.ConsiderStartingNewStatement();
                            sqlTree.ConsiderStartingNewClause();
                            ProcessCompoundKeyword(tokenList, sqlTree, sqlTree.CurrentContainer, ref tokenID, significantTokenPositions, 2);
                        }
                        else if (significantTokensString.StartsWith("NATIONAL CHARACTER VARYING "))
                        {
                            ProcessCompoundKeyword(tokenList, sqlTree, sqlTree.CurrentContainer, ref tokenID, significantTokenPositions, 3);
                        }
                        else if (significantTokensString.StartsWith("NATIONAL CHAR VARYING "))
                        {
                            ProcessCompoundKeyword(tokenList, sqlTree, sqlTree.CurrentContainer, ref tokenID, significantTokenPositions, 3);
                        }
                        else if (significantTokensString.StartsWith("BINARY VARYING "))
                        {
                            //TODO: Figure out how to handle "Compound Keyword Datatypes" so they are still correctly highlighted
                            ProcessCompoundKeyword(tokenList, sqlTree, sqlTree.CurrentContainer, ref tokenID, significantTokenPositions, 2);
                        }
                        else if (significantTokensString.StartsWith("CHAR VARYING "))
                        {
                            ProcessCompoundKeyword(tokenList, sqlTree, sqlTree.CurrentContainer, ref tokenID, significantTokenPositions, 2);
                        }
                        else if (significantTokensString.StartsWith("CHARACTER VARYING "))
                        {
                            ProcessCompoundKeyword(tokenList, sqlTree, sqlTree.CurrentContainer, ref tokenID, significantTokenPositions, 2);
                        }
                        else if (significantTokensString.StartsWith("DOUBLE PRECISION "))
                        {
                            ProcessCompoundKeyword(tokenList, sqlTree, sqlTree.CurrentContainer, ref tokenID, significantTokenPositions, 2);
                        }
                        else if (significantTokensString.StartsWith("NATIONAL CHARACTER "))
                        {
                            ProcessCompoundKeyword(tokenList, sqlTree, sqlTree.CurrentContainer, ref tokenID, significantTokenPositions, 2);
                        }
                        else if (significantTokensString.StartsWith("NATIONAL CHAR "))
                        {
                            ProcessCompoundKeyword(tokenList, sqlTree, sqlTree.CurrentContainer, ref tokenID, significantTokenPositions, 2);
                        }
                        else if (significantTokensString.StartsWith("NATIONAL TEXT "))
                        {
                            ProcessCompoundKeyword(tokenList, sqlTree, sqlTree.CurrentContainer, ref tokenID, significantTokenPositions, 2);
                        }
                        else if (significantTokensString.StartsWith("INSERT "))
                        {
                            sqlTree.ConsiderStartingNewStatement();
                            sqlTree.ConsiderStartingNewClause();
                            sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value);
                        }
                        else if (significantTokensString.StartsWith("BULK INSERT "))
                        {
                            sqlTree.ConsiderStartingNewStatement();
                            sqlTree.ConsiderStartingNewClause();
                            ProcessCompoundKeyword(tokenList, sqlTree, sqlTree.CurrentContainer, ref tokenID, significantTokenPositions, 2);
                        }
                        else if (significantTokensString.StartsWith("SELECT "))
                        {
                            if (sqlTree.NewStatementDue)
                                sqlTree.ConsiderStartingNewStatement();

                            bool selectShouldntTryToStartNewStatement = false;

                            if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_SQL_CLAUSE))
                            {
                                XmlElement firstStatementClause = sqlTree.GetFirstNonWhitespaceNonCommentChildElement(sqlTree.CurrentContainer.ParentNode);

                                bool isPrecededByInsertStatement = false;
                                foreach (XmlElement clause in sqlTree.CurrentContainer.ParentNode.SelectNodes(SqlXmlConstants.ENAME_SQL_CLAUSE))
                                    if (ContentStartsWithKeyword(clause, "INSERT"))
                                        isPrecededByInsertStatement = true;

                                if (isPrecededByInsertStatement)
                                {
                                    bool existingSelectClauseFound = false;
                                    foreach (XmlElement clause in sqlTree.CurrentContainer.ParentNode.SelectNodes(SqlXmlConstants.ENAME_SQL_CLAUSE))
                                        if (ContentStartsWithKeyword(clause, "SELECT"))
                                            existingSelectClauseFound = true;

                                    bool existingValuesClauseFound = false;
                                    foreach (XmlElement clause in sqlTree.CurrentContainer.ParentNode.SelectNodes(SqlXmlConstants.ENAME_SQL_CLAUSE))
                                        if (ContentStartsWithKeyword(clause, "VALUES"))
                                            existingValuesClauseFound = true;

                                    bool existingExecClauseFound = false;
                                    foreach (XmlElement clause in sqlTree.CurrentContainer.ParentNode.SelectNodes(SqlXmlConstants.ENAME_SQL_CLAUSE))
                                        if (ContentStartsWithKeyword(clause, "EXEC")
                                            || ContentStartsWithKeyword(clause, "EXECUTE"))
                                            existingExecClauseFound = true;

                                    if (!existingSelectClauseFound
                                        && !existingValuesClauseFound
                                        && !existingExecClauseFound
                                        )
                                        selectShouldntTryToStartNewStatement = true;
                                }

                                XmlElement firstEntryOfThisClause = sqlTree.GetFirstNonWhitespaceNonCommentChildElement(sqlTree.CurrentContainer);
                                if (firstEntryOfThisClause != null && firstEntryOfThisClause.Name.Equals(SqlXmlConstants.ENAME_SET_OPERATOR_CLAUSE))
                                    selectShouldntTryToStartNewStatement = true;
                            }

                            if (!selectShouldntTryToStartNewStatement)
                                sqlTree.ConsiderStartingNewStatement();

                            sqlTree.ConsiderStartingNewClause();

                            sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value);
                        }
                        else if (significantTokensString.StartsWith("UPDATE "))
                        {
                            if (sqlTree.NewStatementDue)
                                sqlTree.ConsiderStartingNewStatement();

                            if (!(sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT)
                                    && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_CURSOR_FOR_OPTIONS)
                                    )
                                )
                            {
                                sqlTree.ConsiderStartingNewStatement();
                                sqlTree.ConsiderStartingNewClause();
                            }

                            sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value);
                        }
                        else if (significantTokensString.StartsWith("TO "))
                        {
                            if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT)
                                && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_PERMISSIONS_TARGET)
                                )
                            {
                                sqlTree.MoveToAncestorContainer(2, SqlXmlConstants.ENAME_PERMISSIONS_BLOCK);
                                sqlTree.StartNewContainer(SqlXmlConstants.ENAME_PERMISSIONS_RECIPIENT, token.Value, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT);
                            }
                            else
                            {
                                //I don't currently know whether there is any other place where "TO" can be used in T-SQL...
                                // TODO: look into that.
                                // -> for now, we'll just save as a random keyword without raising an error.
                                sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value);
                            }
                        }
                        else if (significantTokensString.StartsWith("FROM "))
                        {
                            if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT)
                                && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_PERMISSIONS_TARGET)
                                )
                            {
                                sqlTree.MoveToAncestorContainer(2, SqlXmlConstants.ENAME_PERMISSIONS_BLOCK);
                                sqlTree.StartNewContainer(SqlXmlConstants.ENAME_PERMISSIONS_RECIPIENT, token.Value, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT);
                            }
                            else
                            {
                                sqlTree.ConsiderStartingNewClause();
                                sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value);
                                sqlTree.CurrentContainer = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_SELECTIONTARGET, "");
                            }
                        }
                        else if (significantTokensString.StartsWith("CASCADE ")
                            && sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT)
                            && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_PERMISSIONS_RECIPIENT)
                            )
                        {
                            sqlTree.MoveToAncestorContainer(2, SqlXmlConstants.ENAME_PERMISSIONS_BLOCK);
                            sqlTree.CurrentContainer = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT, "", sqlTree.SaveNewElement(SqlXmlConstants.ENAME_DDL_WITH_CLAUSE, ""));
                            sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value);
                        }
                        else if (significantTokensString.StartsWith("SET "))
                        {
                            XmlElement firstNonCommentSibling2 = sqlTree.GetFirstNonWhitespaceNonCommentChildElement(sqlTree.CurrentContainer);
                            if (!(
                                    firstNonCommentSibling2 != null
                                    && firstNonCommentSibling2.Name.Equals(SqlXmlConstants.ENAME_OTHERKEYWORD)
                                    && firstNonCommentSibling2.InnerText.ToUpperInvariant().StartsWith("UPDATE")
                                    )
                                )
                                sqlTree.ConsiderStartingNewStatement();

                            sqlTree.ConsiderStartingNewClause();
                            sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value);
                        }
                        else if (significantTokensString.StartsWith("BETWEEN "))
                        {
                            sqlTree.CurrentContainer = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_BETWEEN_CONDITION, "");
                            sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value, sqlTree.SaveNewElement(SqlXmlConstants.ENAME_CONTAINER_OPEN, ""));
                            sqlTree.CurrentContainer = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_BETWEEN_LOWERBOUND, "");
                        }
                        else if (significantTokensString.StartsWith("AND "))
                        {
                            if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_BETWEEN_LOWERBOUND))
                            {
                                sqlTree.MoveToAncestorContainer(1, SqlXmlConstants.ENAME_BETWEEN_CONDITION);
                                sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value, sqlTree.SaveNewElement(SqlXmlConstants.ENAME_CONTAINER_CLOSE, ""));
                                sqlTree.CurrentContainer = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_BETWEEN_UPPERBOUND, "");
                            }
                            else
                            {
                                sqlTree.EscapeAnyBetweenConditions();
                                sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value, sqlTree.SaveNewElement(SqlXmlConstants.ENAME_AND_OPERATOR, ""));
                            }
                        }
                        else if (significantTokensString.StartsWith("OR "))
                        {
                            sqlTree.EscapeAnyBetweenConditions();
                            sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value, sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OR_OPERATOR, ""));
                        }
                        else if (significantTokensString.StartsWith("WITH "))
                        {
                            if (sqlTree.NewStatementDue)
                                sqlTree.ConsiderStartingNewStatement();

                            if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_SQL_CLAUSE)
                                && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_SQL_STATEMENT)
                                && !sqlTree.HasNonWhiteSpaceNonCommentContent(sqlTree.CurrentContainer)
                                )
                            {
                                sqlTree.CurrentContainer = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_CTE_WITH_CLAUSE, "");
                                sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value, sqlTree.SaveNewElement(SqlXmlConstants.ENAME_CONTAINER_OPEN, ""));
                                sqlTree.CurrentContainer = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_CTE_ALIAS, "");
                            }
                            else if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT)
                                && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_PERMISSIONS_RECIPIENT)
                                )
                            {
                                sqlTree.MoveToAncestorContainer(2, SqlXmlConstants.ENAME_PERMISSIONS_BLOCK);
                                sqlTree.StartNewContainer(SqlXmlConstants.ENAME_DDL_WITH_CLAUSE, token.Value, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT);
                            }
                            else if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_DDL_PROCEDURAL_BLOCK)
                                || sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_DDL_OTHER_BLOCK)
                                )
                            {
                                sqlTree.StartNewContainer(SqlXmlConstants.ENAME_DDL_WITH_CLAUSE, token.Value, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT);
                            }
                            else if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_SELECTIONTARGET))
                            {
                                sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value);
                            }
                            else
                            {
                                sqlTree.ConsiderStartingNewClause();
                                sqlTree.SaveNewElement(SqlXmlConstants.ENAME_OTHERKEYWORD, token.Value);
                            }
                        }
                        else if (tokenList.Count > tokenID + 1
                            && tokenList[tokenID + 1].Type == SqlTokenType.Colon
                            && !(tokenList.Count > tokenID + 2
                                && tokenList[tokenID + 2].Type == SqlTokenType.Colon
                                )
                            )
                        {
                            sqlTree.ConsiderStartingNewStatement();
                            sqlTree.SaveNewElement(SqlXmlConstants.ENAME_LABEL, token.Value + tokenList[tokenID + 1].Value);
                            tokenID++;
                        }
                        else
                        {
                            //miscellaneous single-word tokens, which may or may not be statement starters and/or clause starters

                            //check for statements starting...
                            if (IsStatementStarter(token) || sqlTree.NewStatementDue)
                            {
                                sqlTree.ConsiderStartingNewStatement();
                            }

                            //check for statements starting...
                            if (IsClauseStarter(token))
                            {
                                sqlTree.ConsiderStartingNewClause();
                            }

                            string newNodeName = SqlXmlConstants.ENAME_OTHERNODE;
                            KeywordType matchedKeywordType;
                            if (KeywordList.TryGetValue(token.Value, out matchedKeywordType))
                            {
                                switch (matchedKeywordType)
                                {
                                    case KeywordType.OperatorKeyword:
                                        newNodeName = SqlXmlConstants.ENAME_ALPHAOPERATOR;
                                        break;
                                    case KeywordType.FunctionKeyword:
                                        newNodeName = SqlXmlConstants.ENAME_FUNCTION_KEYWORD;
                                        break;
                                    case KeywordType.DataTypeKeyword:
                                        newNodeName = SqlXmlConstants.ENAME_DATATYPE_KEYWORD;
                                        break;
                                    case KeywordType.OtherKeyword:
                                        sqlTree.EscapeAnySelectionTarget();
                                        newNodeName = SqlXmlConstants.ENAME_OTHERKEYWORD;
                                        break;
                                    default:
                                        throw new Exception("Unrecognized Keyword Type!");
                                }
                            }

                            sqlTree.SaveNewElement(newNodeName, token.Value);
                        }
                        break;

                    case SqlTokenType.Semicolon:
                        sqlTree.SaveNewElement(SqlXmlConstants.ENAME_SEMICOLON, token.Value);
                        sqlTree.NewStatementDue = true;
                        break;

                    case SqlTokenType.Colon:
                        if (tokenList.Count > tokenID + 1
                            && tokenList[tokenID + 1].Type == SqlTokenType.Colon
                            )
                        {
                            sqlTree.SaveNewElement(SqlXmlConstants.ENAME_SCOPERESOLUTIONOPERATOR, token.Value + tokenList[tokenID + 1].Value);
                            tokenID++;
                        }
                        else
                        {
                            sqlTree.SaveNewElementWithError(SqlXmlConstants.ENAME_OTHEROPERATOR, token.Value);
                        }
                        break;

                    case SqlTokenType.Comma:
                        bool isCTESplitter = (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT)
                            && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_CTE_WITH_CLAUSE)
                            );

                        sqlTree.SaveNewElement(GetEquivalentSqlNodeName(token.Type), token.Value);

                        if (isCTESplitter)
                        {
                            sqlTree.MoveToAncestorContainer(1, SqlXmlConstants.ENAME_CTE_WITH_CLAUSE);
                            sqlTree.CurrentContainer = sqlTree.SaveNewElement(SqlXmlConstants.ENAME_CTE_ALIAS, "");
                        }
                        break;

                    case SqlTokenType.MultiLineComment:
                    case SqlTokenType.SingleLineComment:
                    case SqlTokenType.WhiteSpace:
                        //create in statement rather than clause if there are no siblings yet
                        if (sqlTree.PathNameMatches(0, SqlXmlConstants.ENAME_SQL_CLAUSE)
                            && sqlTree.PathNameMatches(1, SqlXmlConstants.ENAME_SQL_STATEMENT)
                            && sqlTree.CurrentContainer.SelectSingleNode("*") == null
                            )
                            sqlTree.SaveNewElementAsPriorSibling(GetEquivalentSqlNodeName(token.Type), token.Value, sqlTree.CurrentContainer);
                        else
                            sqlTree.SaveNewElement(GetEquivalentSqlNodeName(token.Type), token.Value);
                        break;

                    case SqlTokenType.BracketQuotedName:
                    case SqlTokenType.Asterisk:
                    case SqlTokenType.Period:
                    case SqlTokenType.NationalString:
                    case SqlTokenType.String:
                    case SqlTokenType.QuotedString:
                    case SqlTokenType.OtherOperator:
                    case SqlTokenType.Number:
                    case SqlTokenType.BinaryValue:
                    case SqlTokenType.MonetaryValue:
                    case SqlTokenType.PseudoName:
                        sqlTree.SaveNewElement(GetEquivalentSqlNodeName(token.Type), token.Value);
                        break;
                    default:
                        throw new Exception("Unrecognized element encountered!");
                }

                tokenID++;
            }

            if (!sqlTree.FindValidBatchEnd())
                sqlTree.ErrorFound = true;

            return sqlTree;
        }
Example #46
0
        private void ProcessFile(string fileName, Task convertPatternsTask, WorkflowResult workflowResult, CancellationToken cancellationToken = default(CancellationToken))
        {
            ParseTree parseTree = null;

            try
            {
                Logger.LogInfo(new MessageEventArgs(MessageType.ProcessingStarted, fileName));

                parseTree = ReadAndParse(fileName, workflowResult);
                if (parseTree != null)
                {
                    workflowResult.AddResultEntity(parseTree);

                    if (Stage >= Stage.Convert)
                    {
                        var stopwatch = Stopwatch.StartNew();
                        IParseTreeToUstConverter converter = ParserConverterSets[parseTree.SourceLanguage].Converter;
                        Ust ust = converter.Convert(parseTree);
                        stopwatch.Stop();
                        Logger.LogInfo($"File {fileName} has been converted (Elapsed: {stopwatch.Elapsed}).");
                        workflowResult.AddConvertTime(stopwatch.ElapsedTicks);
                        workflowResult.AddResultEntity(ust, true);

                        cancellationToken.ThrowIfCancellationRequested();

                        if (Stage >= Stage.Preprocess)
                        {
                            if (IsIncludePreprocessing)
                            {
                                var ustPreprocessor = new UstPreprocessor()
                                {
                                    Logger = logger
                                };
                                stopwatch.Restart();
                                ust = ustPreprocessor.Preprocess(ust);
                                stopwatch.Stop();
                                Logger.LogInfo($"Ust of file {fileName} has been preprocessed (Elapsed: {stopwatch.Elapsed}).");
                                workflowResult.AddPreprocessTime(stopwatch.ElapsedTicks);
                                workflowResult.AddResultEntity(ust, false);

                                cancellationToken.ThrowIfCancellationRequested();
                            }

                            if (Stage >= Stage.Match)
                            {
                                if (!convertPatternsTask.IsCompleted)
                                {
                                    convertPatternsTask.Wait();
                                }

                                stopwatch.Restart();
                                IEnumerable <MatchingResult> matchingResults = UstPatternMatcher.Match(ust);
                                stopwatch.Stop();
                                Logger.LogInfo($"File {fileName} has been matched with patterns (Elapsed: {stopwatch.Elapsed}).");
                                workflowResult.AddMatchTime(stopwatch.ElapsedTicks);
                                workflowResult.AddResultEntity(matchingResults);

                                cancellationToken.ThrowIfCancellationRequested();
                            }
                        }
                    }
                }
            }
            catch (OperationCanceledException)
            {
            }
            catch (Exception ex)
            {
                Logger.LogError(ex);
            }
            finally
            {
                workflowResult.AddProcessedFilesCount(1);
                double progress = workflowResult.TotalFilesCount == 0
                    ? 1
                    : (double)workflowResult.TotalProcessedFilesCount / workflowResult.TotalFilesCount;
                Logger.LogInfo(new ProgressEventArgs(progress, fileName));
                Logger.LogInfo(new MessageEventArgs(MessageType.ProcessingCompleted, fileName));

                if (parseTree == null)
                {
                    Logger.LogInfo(new MessageEventArgs(MessageType.ProcessingIgnored, fileName));
                }

                cancellationToken.ThrowIfCancellationRequested();
            }
        }
Example #47
0
 public JavaPackage?TryLoad(string uri, out ParseTree parseTree)
 {
     return(TryParse(File.ReadAllText(uri), uri, out parseTree));
 }
Example #48
0
        private void btnCompilar_Click(object sender, EventArgs e)
        {
            try
            {
                limpiar();
                if (textoCodigo.TextLength == 0)
                {
                    MessageBox.Show("No se puede compilar esta vacío", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                else if (load == true)
                {
                    AnalizeCode();
                }
                bool resultado = Sintactico.analizar(textoCodigo.Text);
                dtgSemantico.Rows.Clear();
                ParseTree          arbol     = Sintactico.retornoArbol(textoCodigo.Text);
                RecorridoParseTree recorrido = new RecorridoParseTree(arbol);
                var nodos = recorrido.Recorrer();
                int con = 0;
                int menor = 0, mayor = 0;
                foreach (var item in nodos)
                {
                    #region Imprime los valores del arbol
                    //MessageBox.Show("#" + con.ToString()
                    //+ " *ITEM: " + item.ToString()
                    //+ " *associativity: " + item.Associativity.ToString()
                    //+ " *Span End position: " + item.Span.EndPosition
                    //+ " *Span Length: " + item.Span.Length
                    //+ " *Span : Location" + item.Span.Location
                    //+ " *Term: " + item.Term.ToString()
                    //+ " *TermErrorAlias: " + item.Term.ErrorAlias
                    //+ " *itemtermName: " + item.Term.Name);
                    #endregion
                    #region Agregado de variables declaradas
                    if (item.Term.Name.Equals("Declaracion"))
                    {
                        String tipodedato = null, variable = null, valor = null;
                        menor = item.Span.EndPosition - item.Span.Length;
                        mayor = item.Span.EndPosition;
                        int totalDeclaradas = 0, priTLD = 3;

                        foreach (var item1 in nodos)
                        {
                            if ((item1.Term.Name.Equals("tipodedato") ||
                                 item1.Term.Name.Equals("id") ||
                                 item1.Term.Name.Equals("numero") ||
                                 item1.Term.Name.Equals("numero-decimal") ||
                                 item1.Term.Name.Equals("cualquier") ||
                                 item1.Term.Name.Equals("cualquiercar") ||
                                 item1.Term.Name.Equals("<>in")) &&
                                (item1.Span.EndPosition <= mayor &&
                                 (item1.Span.EndPosition - item1.Span.Length) >= menor))
                            {
                                if (item1.Term.Name.Equals("tipodedato"))
                                {
                                    tipodedato = item1.ToString().Split(' ').ElementAt(0);
                                }
                                if (item1.Term.Name.Equals("id"))
                                {
                                    variable = item1.ToString().Split(' ').ElementAt(0);
                                }
                                if (item1.Term.Name.Equals("numero") ||
                                    item1.Term.Name.Equals("numero-decimal") ||
                                    item1.Term.Name.Equals("cualquier") ||
                                    item1.Term.Name.Equals("cualquiercar") ||
                                    item1.Term.Name.Equals("tipodedato"))
                                {
                                    if (item1.Term.Name.Equals("tipodedato"))
                                    {
                                        valor = null;
                                    }
                                    else if (item1.Term.Name.Equals("cualquier"))
                                    {
                                        valor = item1.ToString().Split('"').ElementAt(1);
                                    }
                                    else
                                    {
                                        valor = item1.ToString().Split(' ').ElementAt(0);
                                    }
                                }
                                if (item1.Term.Name.Equals("<>in") && tipodedato.Equals("entero"))
                                {
                                    int ejem = 0;
                                    valor = Interaction.InputBox("Leer por teclado", "Ingrese el valor de \"" + variable + "\" que es de tipo " + tipodedato, "0");
                                    if (!int.TryParse(valor, out ejem))
                                    {
                                        tbConsola.SelectionColor = Color.Red;
                                        tbConsola.Text          += "Error la variable es de tipo entero, no puede asignar un valor distinto a este";
                                        MessageBox.Show("Error de compilación", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                        return;
                                    }
                                }
                                else if (item1.Term.Name.Equals("<>in") && tipodedato.Equals("doble"))
                                {
                                    double ejem = 0;
                                    valor = Interaction.InputBox("Leer por teclado", "Ingrese el valor de \"" + variable + "\" que es de tipo " + tipodedato, "0");
                                    if (!double.TryParse(valor, out ejem))
                                    {
                                        tbConsola.SelectionColor = Color.Red;
                                        tbConsola.Text          += "Error la variable es de tipo doble, no puede asignar un valor distinto a este";
                                        MessageBox.Show("Error de compilación", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                        return;
                                    }
                                }
                                else if (item1.Term.Name.Equals("<>in") && tipodedato.Equals("flotante"))
                                {
                                    float ejem = 0;
                                    valor = Interaction.InputBox("Leer por teclado", "Ingrese el valor de \"" + variable + "\" que es de tipo " + tipodedato, "0");
                                    if (!float.TryParse(valor, out ejem))
                                    {
                                        tbConsola.SelectionColor = Color.Red;
                                        tbConsola.Text          += "Error la variable es de tipo flotante, no puede asignar un valor distinto a este";
                                        MessageBox.Show("Error de compilación", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                        return;
                                    }
                                }
                                else if (item1.Term.Name.Equals("<>in") && tipodedato.Equals("cadena"))
                                {
                                    valor = Interaction.InputBox("Leer por teclado", "Ingrese el valor de \"" + variable + "\" que es de tipo " + tipodedato, "");
                                }
                                totalDeclaradas++;

                                if (totalDeclaradas == priTLD)
                                {
                                    #region Detecta si ya hay una variable declarada
                                    Boolean declarada = false;
                                    foreach (var itemTablaSimbolos in ts)
                                    {
                                        if (variable.Equals(itemTablaSimbolos.variable) && itemTablaSimbolos.tipo.Equals("Declaracion"))
                                        {
                                            declarada = true;
                                            break;
                                        }
                                        else
                                        {
                                            declarada = false;
                                        }
                                    }
                                    if (declarada == true)
                                    {
                                        resultado = false;
                                        tbConsola.SelectionStart  = tbConsola.TextLength;
                                        tbConsola.SelectionLength = 0;
                                        tbConsola.SelectionColor  = Color.Red;
                                        tbConsola.Text           += ("Error está declarando dos o mas veces la variable \"" + variable + "\", ya se encuentra declarada") + Environment.NewLine;
                                    }
                                    else
                                    {
                                        ts.Add(new TablaSimbolos("Declaracion", tipodedato, variable, valor));
                                    }
                                    priTLD          = 2;
                                    totalDeclaradas = 0;
                                    #endregion
                                }
                            }
                        }

                        #region Si se declara una variable sin valor
                        if (totalDeclaradas == 2)
                        {
                            #region Detecta si ya hay una variable declarada
                            Boolean declarada = false;
                            foreach (var itemTablaSimbolos in ts)
                            {
                                if (variable.Equals(itemTablaSimbolos.variable) && itemTablaSimbolos.tipo.Equals("Declaracion"))
                                {
                                    declarada = true;
                                    break;
                                }
                                else
                                {
                                    declarada = false;
                                }
                            }
                            if (declarada == true)
                            {
                                resultado = false;
                                tbConsola.SelectionStart  = tbConsola.TextLength;
                                tbConsola.SelectionLength = 0;
                                tbConsola.SelectionColor  = Color.Red;
                                tbConsola.Text           += ("Error está declarando dos o mas veces la variable \"" + variable + "\", ya se encuentra declarada") + Environment.NewLine;
                            }
                            else
                            {
                                ts.Add(new TablaSimbolos("Declaracion", tipodedato, variable, valor));
                            }
                            #endregion
                        }
                        #endregion
                    }
                    #endregion

                    #region Detecta si no se ha declarado alguna variable
                    if (item.ToString().Contains("(id)"))
                    {
                        String  var        = item.ToString().Split(' ').ElementAt(0);
                        Boolean encontrada = false;
                        foreach (var item1 in ts)
                        {
                            if (var.Equals(item1.variable) && item1.tipo.Equals("Declaracion"))
                            {
                                encontrada = true;
                                break;
                            }
                            else
                            {
                                encontrada = false;
                            }
                        }
                        if (encontrada == true)
                        {
                            if (resultado == true)
                            {
                                resultado = true;
                            }
                            else
                            {
                                resultado = false;
                            }
                        }
                        else
                        {
                            resultado = false;
                            tbConsola.SelectionColor = Color.Red;
                            tbConsola.Text          += ("No se ha declarado la variable: " + var + " en la linea: " + item.Span.Location) + Environment.NewLine;
                        }
                    }
                    #endregion
                }
                #region Error semantico no se pueden declarar variables que son palabras reservadas
                foreach (var item in nodos)
                {
                    if (item.ToString().Contains("(id)"))
                    {
                        String[] var = item.ToString().Split(' ');
                        foreach (var item1 in ts)
                        {
                            if (var[0].Equals(item1.variable) && item1.tipo.Equals("Reservada"))
                            {
                                tbConsola.SelectionColor = Color.Red;
                                tbConsola.Text          += ("Error no puede utilizar \"" + var[0] + "\" es una palabra reservada en la linea: " + item.Span.Location) + Environment.NewLine;
                                resultado = false;
                            }
                        }
                    }
                }
                #endregion

                #region Añade las variables declaradas al DataGridView desde la lista
                foreach (var item in ts)
                {
                    dtgSemantico.Rows.Add(item.tipo, item.tipoDato, item.variable, item.valor);
                }
                #endregion

                #region Ejecución asignaciones, operaciones e impresiones
                if (resultado)
                {
                    #region Asigna valores a las variables previamente declaradas
                    int     mayorope = 0, menorope = 0;
                    String  cadenaOperacion = null, recorridoope = null, variableasignacion = null, tipoDeclaracion = null;
                    Boolean tipoIgual;
                    int     vueltas = 0;
                    foreach (var item in nodos)
                    {
                        con++;
                        #region Asigna valores a las variables con valor numérico
                        if (item.Term.Name.Equals("asignacion"))
                        {
                            int primerif = 0;
                            menor = item.Span.EndPosition - item.Span.Length;
                            mayor = item.Span.EndPosition;
                            String tipoVariableAsignacion = null, tipoOtrasId = null, otrasId = null;
                            foreach (var itemTodo in nodos)
                            {
                                if (itemTodo.Span.EndPosition <= mayor &&
                                    itemTodo.Span.EndPosition - itemTodo.Span.Length >= menor)
                                {
                                    if (itemTodo.Term.Name.Equals("id") ||
                                        itemTodo.Term.Name.Equals("numero") ||
                                        itemTodo.Term.Name.Equals("numero-decimal") ||
                                        itemTodo.Term.Name.Equals("+") ||
                                        itemTodo.Term.Name.Equals("-") ||
                                        itemTodo.Term.Name.Equals("*") ||
                                        itemTodo.Term.Name.Equals("/") ||
                                        itemTodo.Term.Name.Equals("^") ||
                                        itemTodo.Term.Name.Equals("√") ||
                                        itemTodo.Term.Name.Equals("(") ||
                                        itemTodo.Term.Name.Equals(")"))
                                    {
                                        if (primerif != 0)
                                        {
                                            otrasId          = itemTodo.ToString().Split(' ').ElementAt(0);
                                            cadenaOperacion += otrasId;
                                            if (itemTodo.Term.Name.Equals("id"))
                                            {
                                                foreach (DataGridViewRow variablesId in dtgSemantico.Rows)
                                                {
                                                    if (otrasId.Equals(variablesId.Cells["Variable"].Value))
                                                    {
                                                        tipoOtrasId = variablesId.Cells["TipoDeDato"].Value.ToString();
                                                        if (!tipoVariableAsignacion.Equals(tipoOtrasId))
                                                        {
                                                            tbConsola.Text += "Error en las asignaciones los tipo de dato no pueden ser distintos";
                                                            MessageBox.Show("Error de compilación", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                                            return;
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                        else
                                        {
                                            variableasignacion = itemTodo.ToString().Split(' ').ElementAt(0);
                                            foreach (DataGridViewRow variableAsign in dtgSemantico.Rows)
                                            {
                                                if (variableasignacion.Equals(variableAsign.Cells["Variable"].Value))
                                                {
                                                    tipoVariableAsignacion = variableAsign.Cells["TipoDeDato"].Value.ToString();
                                                }
                                            }
                                        }
                                        primerif++;
                                    }
                                }
                            }
                            String car, car2;
                            //MessageBox.Show(cadenaOperacion);
                            foreach (DataGridViewRow itemOpe in dtgSemantico.Rows)
                            {
                                car  = Convert.ToString(itemOpe.Cells["Variable"].Value);
                                car2 = Convert.ToString(itemOpe.Cells["Valor"].Value);
                                if (car != "")
                                {
                                    cadenaOperacion = cadenaOperacion.Replace(car, car2);
                                }
                            }
                            ParseTreeNode resultadoOpe = Sintactico.operaciones(cadenaOperacion);
                            recorridoope = RecorridoOperacion.resolverOperacion(resultadoOpe);
                            foreach (DataGridViewRow itemTablaSimbolos in dtgSemantico.Rows)
                            {
                                if (variableasignacion.Equals(itemTablaSimbolos.Cells["Variable"].Value) &&
                                    itemTablaSimbolos.Cells["Tipo"].Value.Equals("Declaracion"))
                                {
                                    itemTablaSimbolos.Cells["Valor"].Value = recorridoope;
                                }
                            }
                            cadenaOperacion = null;
                        }
                        #endregion
                        #region Asigna valores a las variables con cualquier tipo de valor
                        else if (item.Term.Name.Equals("asignacionCadena"))
                        {
                            String valor = null;
                            menor = item.Span.EndPosition - item.Span.Length;
                            mayor = item.Span.EndPosition;
                            bool entro = false;
                            foreach (var item1 in nodos)
                            {
                                if (item1.Span.EndPosition <= mayor &&
                                    item1.Span.EndPosition - item1.Span.Length >= menor)
                                {
                                    if (item1.Term.Name.Equals("id") && entro == false)
                                    {
                                        variableasignacion = item1.ToString().Split(' ').ElementAt(0);
                                    }
                                    if (item1.Term.Name.Equals("="))
                                    {
                                        entro = true;
                                    }
                                    if (item1.Term.Name.Equals("cualquier") && entro == true)
                                    {
                                        valor += item1.ToString().Split('"').ElementAt(1);
                                    }
                                    if (item1.Term.Name.Equals("id") && entro == true)
                                    {
                                        foreach (DataGridViewRow valorId in dtgSemantico.Rows)
                                        {
                                            if (item1.ToString().Split(' ').ElementAt(0).Equals(valorId.Cells["Variable"].Value) &&
                                                valorId.Cells["Tipo"].Value.Equals("Declaracion") &&
                                                valorId.Cells["TipoDeDato"].Value.Equals("cadena"))
                                            {
                                                valor += valorId.Cells["Valor"].Value;
                                            }
                                            else if ((item1.ToString().Split(' ').ElementAt(0).Equals(valorId.Cells["Variable"].Value) &&
                                                      valorId.Cells["Tipo"].Value.Equals("Declaracion") &&
                                                      !valorId.Cells["TipoDeDato"].Value.Equals("cadena")))
                                            {
                                                resultado = false;
                                                tbConsola.SelectionColor = Color.Red;
                                                tbConsola.Text           = "Error no se puede concatenar un entero con una cadena";
                                                MessageBox.Show("Error de compilación", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                                return;
                                            }
                                        }
                                    }
                                }
                            }
                            foreach (DataGridViewRow itemTablaSimbolos in dtgSemantico.Rows)
                            {
                                if (variableasignacion.Equals(itemTablaSimbolos.Cells["Variable"].Value) &&
                                    itemTablaSimbolos.Cells["Tipo"].Value.Equals("Declaracion"))
                                {
                                    itemTablaSimbolos.Cells["Valor"].Value = valor;
                                }
                            }
                        }
                        #endregion
                    }

                    #endregion


                    #region Imprime valores de variables, impresiones complejas, numeros etc.
                    foreach (var item in nodos)
                    {
                        #region Imprime valores individuales
                        if (item.Term.Name.Equals("impresion"))
                        {
                            menor = item.Span.EndPosition - item.Span.Length;
                            mayor = item.Span.EndPosition;
                            foreach (var item1 in nodos)
                            {
                                if ((item1.Term.Name.Equals("id")) &&
                                    (item1.Span.EndPosition <= mayor &&
                                     (item1.Span.EndPosition - item1.Span.Length) >= menor))
                                {
                                    foreach (DataGridViewRow itemTablaSimbolos in dtgSemantico.Rows)
                                    {
                                        if (item1.ToString().Split(' ').ElementAt(0).Equals(itemTablaSimbolos.Cells["Variable"].Value))
                                        {
                                            if (itemTablaSimbolos.Cells["Valor"].Value == null)
                                            {
                                                tbConsola.Text += (itemTablaSimbolos.Cells["Variable"].Value + " Variable sin valor asignado") + Environment.NewLine;
                                            }
                                            else
                                            {
                                                tbConsola.Text += (itemTablaSimbolos.Cells["Valor"].Value.ToString() + Environment.NewLine);
                                            }
                                        }
                                    }
                                }
                                else if ((item1.Term.Name.Equals("cualquier")) &&
                                         (item1.Span.EndPosition <= mayor &&
                                          (item1.Span.EndPosition - item1.Span.Length) >= menor))
                                {
                                    tbConsola.Text += (item1.ToString().Split('"').ElementAt(1)) + Environment.NewLine;
                                }
                                else if ((item1.Term.Name.Equals("numero") || (item1.Term.Name.Equals("numero-decimal"))) &&
                                         (item1.Span.EndPosition <= mayor &&
                                          (item1.Span.EndPosition - item1.Span.Length) >= menor))
                                {
                                    tbConsola.Text += (item1.ToString().Split(' ').ElementAt(0)) + Environment.NewLine;
                                }
                            }
                        }
                        #endregion
                        #region Imprime valores Complejos
                        if (item.Term.Name.Equals("impresionCompleja"))
                        {
                            menor = item.Span.EndPosition - item.Span.Length;
                            mayor = item.Span.EndPosition;
                            foreach (var item1 in nodos)
                            {
                                if ((item1.Term.Name.Equals("cualquier")) &&
                                    (item1.Span.EndPosition <= mayor &&
                                     (item1.Span.EndPosition - item1.Span.Length) >= menor))
                                {
                                    tbConsola.Text += (item1.ToString().Split('"').ElementAt(1));
                                }
                                if ((item1.Term.Name.Equals("id")) &&
                                    (item1.Span.EndPosition <= mayor &&
                                     (item1.Span.EndPosition - item1.Span.Length) >= menor))
                                {
                                    foreach (DataGridViewRow itemTablaSimbolos in dtgSemantico.Rows)
                                    {
                                        if (item1.ToString().Split(' ').ElementAt(0).Equals(itemTablaSimbolos.Cells["Variable"].Value))
                                        {
                                            if (itemTablaSimbolos.Cells["Valor"].Value == null)
                                            {
                                                tbConsola.Text += (itemTablaSimbolos.Cells["Variable"].Value + " Variable sin valor asignado");
                                            }
                                            else
                                            {
                                                tbConsola.Text += (itemTablaSimbolos.Cells["Valor"].Value.ToString());
                                            }
                                        }
                                    }
                                }
                                else if ((item1.Term.Name.Equals("numero") || (item1.Term.Name.Equals("numero-decimal"))) &&
                                         (item1.Span.EndPosition <= mayor &&
                                          (item1.Span.EndPosition - item1.Span.Length) >= menor))
                                {
                                    tbConsola.Text += (item1.ToString().Split(' ').ElementAt(0)) + Environment.NewLine;
                                }
                            }
                            tbConsola.Text += Environment.NewLine;
                        }
                        #endregion
                        #endregion
                        if (item.Term.Name.Equals("condicional"))
                        {
                            menor = item.Span.EndPosition - item.Span.Length;
                            mayor = item.Span.EndPosition;
                            foreach (var item1 in nodos)
                            {
                                if ((item1.Span.EndPosition <= mayor &&
                                     (item1.Span.EndPosition - item1.Span.Length) >= menor))
                                {
                                    //Si quiero hacer el if, aquí está la magia
                                    nodos.Remove(item1);
                                }
                            }
                        }
                    }
                    tbConsola.Text += ("Compilación correcta") + Environment.NewLine;
                }
                else
                {
                    tbConsola.SelectionColor = Color.Red;
                    MessageBox.Show("Error de compilación", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                ts.Clear();
                LlenadoTablaSimbolos();
                #endregion
            }
            catch (NullReferenceException ex)
            {
                MessageBox.Show("Excepción " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
Example #49
0
 private void PreProcess(ParseTree tree)
 {
     ParseNode rootNode = tree.Nodes[0];
     PreProcessLocks(rootNode);
     PreProcessStatements(rootNode);
 }
Example #50
0
 public object GetValue(ParseTree tree, TokenType type, int index)
 {
     return(GetValue(tree, type, ref index));
 }
Example #51
0
 public ParseTree Parse(string input)
 {
     tree = new ParseTree();
     return(Parse(input, tree));
 }
Example #52
0
 private void txtSource_TextChanged(object sender, EventArgs e) {
   _parseTree = null; //force it to recompile on run
 }
        public void ParseTreeExtraLeftBracketTwoTest()
        {
            var tree = new ParseTree("( * ( + 1 ( 2 ) 2 )");

            tree.Result();
        }
Example #54
0
            /*
             * IDENTIFIER Params SEMICOLON
             * or
             * IDENTIFIER Params Block
             * * SEMICOLON after Block will be allowed
             * returns MoccaSuite::Something
             */
            public virtual object EvalStatement(ParseTree tree, params object[] paramlist)
            {
                string            identifier = (string)this.GetValue(tree, TokenType.IDENTIFIER, 0);
                List <object>     param      = (List <object>) this.GetValue(tree, TokenType.Params, 0);
                List <MoccaSuite> block      = null;

                if (this.GetValue(tree, TokenType.Block, 0) != null)
                {
                    block = (List <MoccaSuite>) this.GetValue(tree, TokenType.Block, 0);
                }

                switch (identifier)
                {
                case "if":
                    MoccaLogic a = new MoccaLogic();
                    a.keyword = "if";
                    if (param[0].ToString().Equals("true"))
                    {
                        a.expression = new MoccaExpression("True");
                    }
                    else if (param[0].ToString().Equals("false"))
                    {
                        a.expression = new MoccaExpression("False");
                    }
                    else
                    {
                        a.expression = (MoccaExpression)param[0];
                    }
                    a.cmd_list = block;
                    return(a);

                case "elif":
                    MoccaLogic b = new MoccaLogic();
                    b.keyword = "elif";
                    if (param[0].ToString().Equals("true"))
                    {
                        b.expression = new MoccaExpression("True");
                    }
                    else if (param[0].ToString().Equals("false"))
                    {
                        b.expression = new MoccaExpression("False");
                    }
                    else
                    {
                        b.expression = (MoccaExpression)param[0];
                    }
                    b.cmd_list = block;
                    return(b);

                case "else":
                    MoccaLogic c = new MoccaLogic();
                    c.keyword  = "else";
                    c.cmd_list = block;
                    return(c);

                case "while":
                    MoccaWhile d = new MoccaWhile();
                    if (param[0].ToString().Equals("true"))
                    {
                        d.expression = new MoccaExpression("True");
                    }
                    else if (param[0].ToString().Equals("false"))
                    {
                        d.expression = new MoccaExpression("False");
                    }
                    else
                    {
                        d.expression = (MoccaExpression)param[0];
                    }
                    d.cmd_list = block;
                    return(d);

                case "for":
                    MoccaFor e = new MoccaFor();
                    e.iter     = param[0];
                    e.cmd_list = block;
                    return(e);

                case "event":
                    if (param.Count == 1)
                    {
                        return(new MoccaEvent(MoccaEvent.recognizeType(param[0].ToString()), null));
                    }
                    else
                    {
                        return(new MoccaEvent(MoccaEvent.recognizeType(param[0].ToString()), param[1].ToString()));
                    }

                default:
                    MoccaCommand f = new MoccaCommand(identifier, param);
                    return(f);
                }
            }
Example #55
0
		protected override void TranslateStructInstance(List<string> output, ParseTree.StructInstance structInstance)
		{
			output.Add("new ");
			output.Add(structInstance.NameToken.Value);
			output.Add("(");
			for (int i = 0; i < structInstance.Args.Length; ++i)
			{
				if (i > 0) output.Add(", ");
				this.TranslateExpression(output, structInstance.Args[i]);
			}
			output.Add(")");
		}
Example #56
0
        void takeItem(ParseTree tokens)
        {
            Player player          = GameObject.GetComponent <Player>("player");
            Room   currentLocation = player.PlayerLocation;

            if (LocationKey != player.LocationKey)
            {
                if (LocationKey == "inventory")
                {
                    GameController.InputResponse.AppendFormat($"You already have the item {Name}.\n");
                    return;
                }


                //if the item is inside an open container at the players current location
                foreach (StoryItem item in currentLocation.RoomItems)
                {
                    if (item is Container && this.LocationKey == item.KeyValue && (item as Container).IsOpen)
                    {
                        Container chest = (Container)item;

                        if (player.BackPack.ItemCount < player.BackPack.Slots)
                        {
                            chest.RemoveItem(this);
                            LocationKey = "inventory";
                            GameController.InputResponse.AppendFormat($"{Name} taken.\n");
                            player.BackPack.ItemCount += 1;
                        }

                        else
                        {
                            GameController.InputResponse.AppendFormat($"You don't have any space for {Name} in your inventory! Try dropping something you don't need.\n");
                        }

                        return;
                    }
                }


                GameController.InputResponse.AppendFormat($"There is no {Name} here to take.\n");
                return;
            }

            if (IsPortable)
            {
                if (player.BackPack.ItemCount < player.BackPack.Slots)
                {
                    LocationKey = "inventory";
                    GameController.InputResponse.AppendFormat($"{Name} taken.\n");
                    player.BackPack.ItemCount += 1;
                }

                else
                {
                    GameController.InputResponse.AppendFormat($"You don't have any space for {Name} in your inventory! Try dropping something you don't need.\n");
                }
            }

            else
            {
                GameController.InputResponse.AppendFormat($"You try to take {Name} but it won't budge!\n");
            }
        }
Example #57
0
        private void AutoHighlightStart()
        {
            ParseTree _tree;
            string _currenttext = "";
            while (!isDisposing)
            {
                bool _textchanged;
                lock (treelock)
                {
                    _textchanged = textChanged;
                    if (textChanged)
                    {
                        textChanged = false;
                        _currenttext = currentText;
                    }
                }
                if (!_textchanged)
                {
                    Thread.Sleep(200);
                    continue;
                }

                _tree = (ParseTree)Parser.Parse(_currenttext);
                lock (treelock)
                {
                    if (textChanged)
                        continue;
                    else
                        Tree = _tree; // assign new tree
                }
                
                Textbox.Invoke(new MethodInvoker(HighlightTextInternal));

            }
        }
Example #58
0
 public CodeConverter(ParseTree programTree)
 {
     _programTree = programTree;
 }
Example #59
0
        protected static void ManageParseError(ParseTree tree, StringBuilder output)
        {
            foreach (ParseError error in tree.Errors)
                output.AppendLine(string.Format("({0},{1}): {2}", error.Line, error.Column, error.Message));

            output.AppendLine("Semantic errors in grammar found.");
        }
Example #60
0
        IEnumerable <OverlayShapeVM> CreateOverlayShapesFromItem(TikzParseItem tpi)
        {
            var ret = new List <OverlayShapeVM>();

            if (tpi is Tikz_Scope)
            {
                OverlayScope os = new OverlayScope();
                //os.pol = this;
                os.tikzitem = tpi as Tikz_Scope;

                // add child shapes
                os.children.AddRange((tpi as TikzContainerParseItem).Children.SelectMany(child => CreateOverlayShapesFromItem(child)));

                //foreach (TikzParseItem t in (tpi as TikzContainerParseItem).Children)
                //    DrawObject(t, os.children);

                // don't draw scopes with no drawable children
                // (we don't know where to render them)
                if (os.children.Count > 0)
                {
                    ret.Add(os);
                    os.AdjustPosition(TikzToScreen);
                }
            }
            else if (tpi is TikzContainerParseItem)
            {
                ret.AddRange((tpi as TikzContainerParseItem).Children.SelectMany(child => CreateOverlayShapesFromItem(child)));
            }
            else if (tpi is Tikz_XYItem)
            {
                if ((tpi as Tikz_XYItem).HasEditableCoordinate())
                {
                    OverlayNode el;
                    if (tpi.parent is Tikz_Controls)
                    {
                        el = new OverlayControlPoint();     // control points for Bezier curves
                    }
                    else
                    {
                        el = new OverlayNode();
                    }
                    //el.pol = this;
                    el.tikzitem = tpi as Tikz_XYItem;

                    el.AdjustPosition(TikzToScreen);

                    // add tooltip
                    if (ParseTree != null)
                    {
                        Tikz_Node nref = TikzParseTreeHelper.GetReferenceableNode(tpi as Tikz_XYItem, ParseTree.GetTikzPicture());
                        if (nref != null && !String.IsNullOrWhiteSpace(nref.name))
                        {
                            el.ToolTip = nref.name;
                        }
                    }
                    ////canvas1.Children.Add(el);
                    ret.Add(el);

                    //bbg.Add(new Rect(Canvas.GetLeft(el), Canvas.GetTop(el), el.Width, el.Height));
                }
            }
            else if (tpi is Tikz_Path)
            {
            }

            return(ret);
        }