Exemple #1
0
        /*
         * 处理if语句
         */
        public override object VisitIfStatement([NotNull] CMMParser.IfStatementContext context)
        {
            // 查看expression的结果
            Visit(context.expression());
            IntermediateCode code0 = new IntermediateCode(0, InstructionType.push, context.expression().Start.Line);

            codes.Add(code0);
            // 比较expression的结果和0的关系,等于0的话就跳转走,code1的目的地址待回填
            IntermediateCode code1 = new IntermediateCode(InstructionType.je, context.expression().Stop.Line);

            codes.Add(code1);
            if (context.codeBlock() != null)
            {
                Visit(context.codeBlock());
            }
            IntermediateCode code3 = new IntermediateCode(InstructionType.j, context.codeBlock().Stop.Line);

            codes.Add(code3);
            // 条件不符合的情况应该执行的代码行号为addr0,回填一下
            int addr0 = codes.Count;

            code1.setOperant(addr0);
            List <IntermediateCode> needToAddFinishAddrCodes = new List <IntermediateCode>();

            needToAddFinishAddrCodes.Add(code3);

            // 每个else语句都执行一下
            if (context.elseClause() != null)
            {
                foreach (CMMParser.ElseClauseContext ctx in context.elseClause())
                {
                    if (ctx.ifStatement() == null)
                    {
                        Visit(ctx.codeBlock());
                        IntermediateCode code = new IntermediateCode(InstructionType.j, ctx.codeBlock().Stop.Line);
                        needToAddFinishAddrCodes.Add(code);
                        codes.Add(code);
                    }
                    else
                    {
                        Visit(ctx.ifStatement());
                    }
                }
            }
            foreach (IntermediateCode c in needToAddFinishAddrCodes)
            {
                c.operant = codes.Count;
            }

            return(null);
        }
Exemple #2
0
 /// <summary>
 /// Visit a parse tree produced by <see cref="CMMParser.ifStatement"/>.
 /// <para>
 /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/>
 /// on <paramref name="context"/>.
 /// </para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 /// <return>The visitor result.</return>
 public virtual Result VisitIfStatement([NotNull] CMMParser.IfStatementContext context)
 {
     return(VisitChildren(context));
 }
Exemple #3
0
 /// <summary>
 /// Exit a parse tree produced by <see cref="CMMParser.ifStatement"/>.
 /// <para>The default implementation does nothing.</para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 public virtual void ExitIfStatement([NotNull] CMMParser.IfStatementContext context)
 {
 }