示例#1
0
        // Done during the parsing phase now so redundant code, keeping for now
        //public static void LabelProgram(IEnumerable<IStatement> blocks)
        //{
        //    var labelCounter = 0;
        //    foreach (var statement in blocks)
        //    {
        //        statement.Label = ++labelCounter;
        //    }
        //}

        public static int Init(IAstNode node)
        {
            return(node switch
            {
                Program program => Init(program.TopLevelStmts.First()),
                ScopedBlock scopedBlock => Init(scopedBlock.Statements.First()),
                UnscopedBlock unscopedBlock => Init(unscopedBlock.Statements.First()),
                IStatement statement => statement.Label,
                _ => throw new ArgumentException("Init can only accept Meta Nodes and IStatement Nodes")
            });
        public override IAstNode VisitWhileStmt(MicroCParser.WhileStmtContext context)
        {
            var           label     = ++_label;
            IBExpr        condition = Visit(context.b_expr()) as IBExpr;
            UnscopedBlock body      = Visit(context.unscopedBlock()) as UnscopedBlock;
            var           whileStmt = new WhileStmt(condition, body);

            whileStmt.Label = label;
            return(whileStmt);
        }
        public override IAstNode VisitIfElseStmt(MicroCParser.IfElseStmtContext context)
        {
            var           label      = ++_label;
            IBExpr        condition  = Visit(context.b_expr()) as IBExpr;
            UnscopedBlock ifBody     = Visit(context.ifBody) as UnscopedBlock;
            UnscopedBlock elseBody   = Visit(context.elseBody) as UnscopedBlock;
            var           ifElseStmt = new IfElseStmt(condition, ifBody, elseBody);

            ifElseStmt.Label = label;
            return(ifElseStmt);
        }
示例#4
0
 public IfStmt(IBExpr condition, UnscopedBlock body)
 {
     Condition = condition;
     Body      = body;
 }
示例#5
0
 public IfElseStmt(IBExpr condition, UnscopedBlock ifBody, UnscopedBlock elseBody)
 {
     Condition = condition;
     IfBody    = ifBody;
     ElseBody  = elseBody;
 }