コード例 #1
0
        public override AbstractNode VisitIfElseIfElse([NotNull] GiraphParser.IfElseIfElseContext context)
        {
            IfElseIfElseNode IfNode = new IfElseIfElseNode(context.Start.Line, context.Start.Column);

            IfNode.IfCondition = Visit(context.boolCompOrExp()) as BoolComparisonNode;
            IfNode.IfCodeBlock = Visit(context.codeBlock()) as CodeBlockNode;
            if (context.elseifCond() != null)
            {
                // Loop though all the ElseIf(s)
                foreach (var ElseIf in context.elseifCond())
                {
                    // Add their conditions and codeblocks
                    IfNode.ElseIfList.Add(Tuple.Create((Visit(ElseIf.boolCompOrExp()) as BoolComparisonNode), (Visit(ElseIf.codeBlock()) as CodeBlockNode)));
                }
            }

            // Else codeblock, First codeblock element, then it adopts the rest, if there are any
            if (context.elseCond() != null)
            {
                // There will never be more then one Else block, and it does not have a boolcomparison
                if (context.elseCond().codeBlock().ChildCount > 0)
                {
                    IfNode.ElseCodeBlock = Visit(context.elseCond().codeBlock()) as CodeBlockNode;
                }
            }
            return(IfNode);
        }
コード例 #2
0
        public Node ElseIfList()
        {
            var elseIfList = new ListElseIf();

            while (CurrentToken == TokenCategory.ELSEIF)
            {
                var elseIfToken = new ElseIf()
                {
                    AnchorToken = Expect(TokenCategory.ELSEIF)
                };
                Expect(TokenCategory.PARENTHESIS_OPEN);
                elseIfToken.Add(Expression());
                Expect(TokenCategory.PARENTHESIS_CLOSE);
                var n1 = new ListStatements();
                Expect(TokenCategory.BRACE_OPEN);
                while (firstOfStatement.Contains(CurrentToken))
                {
                    n1.Add(Statement());
                }
                elseIfToken.Add(n1);
                Expect(TokenCategory.BRACE_CLOSE);
                elseIfList.Add(elseIfToken);
            }
            return(elseIfList);
        }
コード例 #3
0
        public static IfThenElse CreateIfThenElse(List <BranchVM> branches)
        {
            if (branches.Count == 0)
            {
                return(null);
            }
            IfThenElse ifThenElse = CreateIfThenElse(branches[0]);

            for (int i = 1; i < branches.Count; i++)
            {
                BranchVM branch = branches[i];
                if (branch.IsTypeElseIf)
                {
                    ElseIf elseIf = CreateElseIf(branch);
                    if (elseIf != null)
                    {
                        ifThenElse.ElseIfs.Add(elseIf);
                    }
                }
                else if (branch.IsTypeElse)
                {
                    ifThenElse.ElseConstructId = branch.ThenConstruct.Id;
                }
            }
            return(ifThenElse);
        }
コード例 #4
0
        private static ElseIf CreateElseIf(BranchVM branch)
        {
            ElseIf elseIf = new ElseIf();

            elseIf.IfCondition     = CreateIfCondition(branch.ValidCondGroups);
            elseIf.ThenConstructId = branch.ThenConstruct.Id;
            return(elseIf);
        }
コード例 #5
0
        /****************************************************************
         *                      If Condition Node
         ***************************************************************/

        public Node IfCondition()
        {
            var result = new If()
            {
                AnchorToken = Expect(TokenCategory.IF)
            };

            if (this.labelCache != null)
            {
                result.Add(this.labelCache);
                this.labelCache = null;
            }

            var expr1 = Expression();

            CheckForThen();
            var stmtList1 = EvaluateStatements();

            result.Add(expr1);
            result.Add(stmtList1);

            while (CurrentToken == TokenCategory.ELSEIF)
            {
                var elseIfToken = Expect(TokenCategory.ELSEIF);
                var expr2       = Expression();
                CheckForThen();
                var stmtList2 = EvaluateStatements();

                var elseIfResult = new ElseIf()
                {
                    expr2, stmtList2
                };
                elseIfResult.AnchorToken = elseIfToken;
                result.Add(elseIfResult);
            }

            if (CurrentToken == TokenCategory.ELSE)
            {
                var elseToken = Expect(TokenCategory.ELSE);
                var stmtList3 = EvaluateStatements();

                var elseResult = new Else()
                {
                    AnchorToken = elseToken
                };
                elseResult.Add(stmtList3);
                result.Add(elseResult);
            }

            if (CurrentToken == TokenCategory.ENDIF)
            {
                Expect(TokenCategory.ENDIF);
            }

            return(result);
        }
コード例 #6
0
        public string Visit(ElseIf node)
        {
            var label = GenerateLabel();

            return(Visit(((dynamic)node[0]))
                   + "ldc.i4.1\n"
                   + "bne.un '" + label + "'\n"
                   + Visit(((dynamic)node[1]))
                   + "'" + label + "':\n");
        }
コード例 #7
0
        public string Visit(ElseIf node)
        {
            var sb = new StringBuilder();

            sb.Append("    else\n");
            sb.Append(Visit((dynamic)node[0]));
            sb.Append("    if\n");
            sb.Append(Visit((dynamic)node[1]));

            return(sb.ToString());
        }
コード例 #8
0
        public string Visit(ElseIf node)
        {
            var lbl = GenerateLabel();

            return
                (Visit(((dynamic)node[0]))
                 + Line(Indent() + "ldc.i4 42")
                 + Line(Indent() + "bne.un '" + lbl + "'")
                 + Visit(((dynamic)node[1]))
                 + Line(Indent() + "'" + lbl + "':"));
        }
コード例 #9
0
        //-----------------------------------------------------------
        public string Visit(ElseIf node)
        {
            var label = GenerateLabel();

            return(String.Format(
                       "\t\t{0}\n\t\tldc.i4 42\n\t\tbne.un '{1}'\n\t\t{2}\n\t'{1}':\n",
                       Visit((dynamic)node[0]),
                       label,
                       Visit((dynamic)node[1])
                       ));
        }
コード例 #10
0
        public Type Visit(ElseIf node)
        {
            var condicion = Visit((dynamic)node[0]);

            if (condicion != Type.BOOL)
            {
                throw new SemanticError("Exp must be of type BOOL, found: " + condicion, node[0].AnchorToken);
            }
            Visit((dynamic)node[1]);
            return(Type.VOID);
        }
コード例 #11
0
ファイル: Parser.cs プロジェクト: danielsada/deep-lingo
        public Node If()
        {
            var n1 = new If();

            n1.AnchorToken = Expect(TokenType.IF);
            Expect(TokenType.PARENTHESIS_OPEN);
            n1.Add(Expression());
            Expect(TokenType.PARENTHESIS_CLOSE);
            Expect(TokenType.BLOCK_BEGIN);
            var n2 = new StatementList();

            while (firstOfStatement.Contains(CurrentToken))
            {
                n2.Add(Statement());
            }
            n1.Add(n2);
            var n3 = new ElseIfList();

            Expect(TokenType.BLOCK_END);
            while (CurrentToken == TokenType.ELSEIF)
            {
                var nelsif = new ElseIf();
                nelsif.AnchorToken = Expect(TokenType.ELSEIF);
                Expect(TokenType.PARENTHESIS_OPEN);
                nelsif.Add(Expression());
                Expect(TokenType.PARENTHESIS_CLOSE);
                Expect(TokenType.BLOCK_BEGIN);
                var stmtList = new StatementList();
                while (firstOfStatement.Contains(CurrentToken))
                {
                    stmtList.Add(Statement());
                }
                nelsif.Add(stmtList);
                n3.Add(nelsif);
                Expect(TokenType.BLOCK_END);
            }
            n1.Add(n3);
            var els = new Else();

            if (CurrentToken == TokenType.ELSE)
            {
                els.AnchorToken = Expect(TokenType.ELSE);
                Expect(TokenType.BLOCK_BEGIN);
                var stmtList = new StatementList();
                while (firstOfStatement.Contains(CurrentToken))
                {
                    stmtList.Add(Statement());
                }
                els.Add(stmtList);
                Expect(TokenType.BLOCK_END);
            }
            n1.Add(els);
            return(n1);
        }
コード例 #12
0
        public string Visit(ElseIf node)
        {
            string st      = "";
            var    ifLabel = GenerateLabel();

            st += Visit((dynamic)node[0]);
            st += "\t\tldc.i4 42\n";
            st += "\t\tbne.un " + ifLabel + "\n";
            st += Visit((dynamic)node[1]);
            st += "\t\t" + ifLabel + ":\n";
            return(st);
        }
コード例 #13
0
 public Type Visit(ElseIf node)
 {
     if (Visit((dynamic)node[0]) != Type.BOOL)
     {
         throw new SemanticError(
                   "Expecting type " + Type.BOOL
                   + " in conditional statement",
                   node.AnchorToken);
     }
     VisitChildren(node[1]);
     return(Type.VOID);
 }
コード例 #14
0
        public string Visit(ElseIf node)
        {
            identSpaces++;
            var    lbl    = GenerateLabel();
            string result = Visit(((dynamic)node[0]))
                            + putS(Indentar() + "ldc.i4 42")
                            + putS(Indentar() + "bne.un '" + lbl + "'")
                            + Visit(((dynamic)node[1]))
                            + putS(Indentar() + "'" + lbl + "':");

            identSpaces--;
            return(result);
        }
コード例 #15
0
        public string Visit(ElseIf node, string labelContinue)
        {
            var result = "";

            result += node[0].GetType() == typeof(Identifier)? loadVariable(node[0].AnchorToken.Value): Visit((dynamic)node[0]);
            var label1 = GenerateLabel();

            result += "\t\tldc.i4 42\n\t\tbne.un " + label1 + "\n";
            result += Visit((dynamic)node[1]);
            result += "\t\tbr " + labelContinue + "\n";
            result += "\t\t" + label1 + ":\n";
            return(result);
        }
コード例 #16
0
ファイル: Parser.cs プロジェクト: k3ll3x/chimera-compiler
        public Node If()
        {
            var result = new If()
            {
                AnchorToken = Expect(TokenCategory.IF)
            };

            result.Add(Expression());
            var thenstatement = new Then()
            {
                AnchorToken = Expect(TokenCategory.THEN)
            };

            while (firstOfStatement.Contains(CurrentToken))
            {
                thenstatement.Add(Statement());
            }
            result.Add(thenstatement);
            while (CurrentToken == TokenCategory.ELSEIF)
            {
                var elif = new ElseIf()
                {
                    AnchorToken = Expect(TokenCategory.ELSEIF)
                };
                elif.Add(Expression());
                var thenst = new Then()
                {
                    AnchorToken = Expect(TokenCategory.THEN)
                };
                while (firstOfStatement.Contains(CurrentToken))
                {
                    thenst.Add(Statement());
                }
                elif.Add(thenst);
                result.Add(elif);
            }
            if (CurrentToken == TokenCategory.ELSE)
            {
                var elsestatement = new Else()
                {
                    AnchorToken = Expect(TokenCategory.ELSE)
                };
                while (firstOfStatement.Contains(CurrentToken))
                {
                    elsestatement.Add(Statement());
                }
            }
            Expect(TokenCategory.END);
            Expect(TokenCategory.SEMICOL);
            return(result);
        }
コード例 #17
0
        internal override void Execute()
        {
            DeletedElseIf.ManageLinks();
            if (_indexOfDeletedBranch < If.ElseIfList.Count - 1)
            {
                ElseIf elseIf = If.ElseIfList[_indexOfDeletedBranch + 1];
                elseIf.Previous = DeletedElseIf.Previous;
            }

            if (_indexOfDeletedBranch > 0)
            {
                ElseIf elseIf = If.ElseIfList[_indexOfDeletedBranch - 1];
                elseIf.Next = DeletedElseIf.Next;
            }
        }
コード例 #18
0
        //<elseif>//
        public string Visit(ElseIf node)
        {
            var thisexit  = elsifexit;
            var tempLabel = GenerateLabel();
            var sb        = new StringBuilder();

            sb.Append(Visit((dynamic)node[0]));
            sb.Append("\t\tldc.i4 42\n");
            sb.Append("\t\tbne.un " + tempLabel + "\n");
            sb.Append(VisitAllButOne(node));
            sb.Append("\t\tbr '" + thisexit + "'\n");
            sb.Append("\t\t'" + tempLabel + "':\n");
            thisexit = "";
            return(sb.ToString());
        }
コード例 #19
0
        public Node ElseIf()
        {
            var node = new ElseIfList();

            while (CurrentToken == TokenCategory.ELSEIF)
            {
                var node_elseif = new ElseIf();
                Expect(TokenCategory.ELSEIF);
                Expect(TokenCategory.OPENEDPAR);
                node_elseif.Add(Expr());
                Expect(TokenCategory.CLOSEDPAR);
                Expect(TokenCategory.OPENEDCURLY);
                node_elseif.Add(StmtList());
                Expect(TokenCategory.CLOSEDCURLY);
                node.Add(node_elseif);
            }
            return(node);
        }
コード例 #20
0
        public Node ElseIf(Token elseToken)
        {
            var statementElseIf = new ElseIf()
            {
                AnchorToken = elseToken
            };

            Expect(TokenCategory.IF);

            Expect(TokenCategory.PARENTHESIS_OPEN);
            statementElseIf.Add(Expr());
            Expect(TokenCategory.PARENTHESIS_CLOSE);

            Expect(TokenCategory.BRACKETS_OPEN);
            statementElseIf.Add(StmtList());
            Expect(TokenCategory.BRACKETS_CLOSE);

            return(statementElseIf);
        }
コード例 #21
0
        public Node ElseIf()
        {
            //elseif(‹expr›){‹stmt-list›} *
            var n = new ElseIfList();

            while (CurrentToken == TokenCategory.ELSEIF)
            {
                var n1 = new ElseIf();
                Expect(TokenCategory.ELSEIF);
                Expect(TokenCategory.OPENEDPAR);
                n1.Add(Expr());
                Expect(TokenCategory.CLOSEDPAR);
                Expect(TokenCategory.OPENEDCURLY);
                n1.Add(StmtList());
                Expect(TokenCategory.CLOSEDCURLY);
                n.Add(n1);
            }
            return(n);
        }
コード例 #22
0
        public Node ElseIfList()
        {
            var elseIfList = new ElseIfList();

            while (Current == TokenCategory.ELSEIF)
            {
                var elseIf = new ElseIf()
                {
                    AnchorToken = Expect(TokenCategory.ELSEIF)
                };
                Expect(TokenCategory.OPEN_PARENTHESIS);
                elseIf.Add(Expr());
                Expect(TokenCategory.CLOSE_PARENTHESIS);
                Expect(TokenCategory.OPEN_BRACKET);
                elseIf.Add(StmtList());
                Expect(TokenCategory.CLOSE_BRACKET);
                elseIfList.Add(elseIf);
            }
            return(elseIfList);
        }
コード例 #23
0
ファイル: Parser.cs プロジェクト: karloconk/Compiladores
        //elseif side function//
        public Node elseif()
        {
            var result = new ElseIf()
            {
                AnchorToken = Expect(TokenCategory.ELSEIF)
            };

            Expect(TokenCategory.PARENTHESIS_OPEN);

            result.Add(Expression());

            Expect(TokenCategory.PARENTHESIS_CLOSE);

            Expect(TokenCategory.CURLY_BRACKET_OPEN);

            result.Add(StmtList());

            Expect(TokenCategory.CURLY_BRACKET_CLOSE);

            return(result);
        }
コード例 #24
0
        public Node ElseIfList()
        {
            var result = new ElseIfList();

            while (CurrentToken == TokenCategory.ELIF)
            {
                var elifNode = new ElseIf();
                var elif     = Expect(TokenCategory.ELIF);
                Expect(TokenCategory.PARENTHESIS_OPEN);
                var expr = Expression();
                elifNode.Add(expr);
                Expect(TokenCategory.PARENTHESIS_CLOSE);
                Expect(TokenCategory.BRACKET_OPEN);
                var stmtList = StmtList();
                elifNode.Add(stmtList);
                Expect(TokenCategory.BRACKET_CLOSE);

                elifNode.AnchorToken = elif;
                result.Add(elifNode);
            }
            return(result);
        }
コード例 #25
0
ファイル: JadeParser.cs プロジェクト: mirannda/Jade4Net
        private Node parseConditional()
        {
            If conditionalToken         = (If)expect(typeof(If));
            ConditionalNode conditional = new ConditionalNode();

            conditional.setLineNumber(conditionalToken.getLineNumber());
            conditional.setFileName(filename);

            List <IfConditionNode> conditions = conditional.getConditions();

            IfConditionNode main = new IfConditionNode(conditionalToken.getValue(), conditionalToken.getLineNumber());

            main.setInverse(conditionalToken.isInverseCondition());
            main.setBlock(block());
            conditions.Add(main);

            while (peek() is ElseIf)
            {
                ElseIf token = (ElseIf)expect(typeof(ElseIf))
                ;
                IfConditionNode elseIf = new IfConditionNode(token.getValue(), token.getLineNumber());
                elseIf.setBlock(block());
                conditions.Add(elseIf);
            }

            if (peek() is Else)
            {
                Else token = (Else)expect(typeof(Else))
                ;
                IfConditionNode elseNode = new IfConditionNode(null, token.getLineNumber());
                elseNode.setDefault(true);
                elseNode.setBlock(block());
                conditions.Add(elseNode);
            }

            return(conditional);
        }
コード例 #26
0
        public static CodeCompileUnit TestElseIfCodeCompileUnit()
        {
            CodeCompileUnit     compileUnit      = new CodeCompileUnit();
            CodeNamespace       codeNamespace    = new CodeNamespace("Test.Namespace");
            CodeTypeDeclaration classDeclaration = new CodeTypeDeclaration("TestClass")
            {
                IsClass = true
            };

            classDeclaration.TypeAttributes =
                (classDeclaration.TypeAttributes & ~TypeAttributes.VisibilityMask) | TypeAttributes.Public;

            var method = new CodeMemberMethod()
            {
                Name       = "Method",
                Attributes = MemberAttributes.Public | MemberAttributes.Final
            };

            method.Statements.Add(
                ElseIf.New(
                    new Tuple <CodeExpression, IEnumerable <CodeStatement> >(
                        Primitives.Bool(true), new CodeStatement[] { new CodeMethodReturnStatement() })));
            method.Statements.Add(
                ElseIf.New(
                    new CodeStatement[] { new CodeMethodReturnStatement() },
                    new Tuple <CodeExpression, IEnumerable <CodeStatement> >(
                        Primitives.Int(1), new CodeStatement[] { new CodeMethodReturnStatement() }),
                    new Tuple <CodeExpression, IEnumerable <CodeStatement> >(
                        Primitives.Int(2), new CodeStatement[] { new CodeMethodReturnStatement() }),
                    new Tuple <CodeExpression, IEnumerable <CodeStatement> >(
                        Primitives.Int(3), new CodeStatement[] { new CodeMethodReturnStatement() })));

            compileUnit.Namespaces.Add(codeNamespace);
            codeNamespace.Types.Add(classDeclaration);
            classDeclaration.Members.Add(method);
            return(compileUnit);
        }
コード例 #27
0
 public DeleteElseIfCommand(If @if, ElseIf existedElseIf)
 {
     If                    = @if;
     DeletedElseIf         = existedElseIf;
     _indexOfDeletedBranch = If.ElseIfList.IndexOf(existedElseIf);
 }
コード例 #28
0
 public void Visit(ElseIf node)
 {
     VisitChildren(node);
 }
コード例 #29
0
 internal InsertElseIfAsNextCommand(If iif, ElseIf newElseIf, ElseIf existedElseIf)
 {
     this.If             = iif;
     this.InsertedElseIf = newElseIf;
     this.ExistedElseIf  = existedElseIf;
 }
コード例 #30
0
 public override bool HasVariableDefined(Interpreter interpreter)
 {
     return((If != null && If.HasVariableDefined(interpreter)) || (ElseIf != null && ElseIf.Any(e => e.HasVariableDefined(interpreter))) || (Else != null && Else.HasVariableDefined(interpreter)));
 }