コード例 #1
0
ファイル: WhileExpression.cs プロジェクト: Cm-lang/Cmc
        public override void SurroundWith(Environment environment)
        {
            base.SurroundWith(environment);
            var jmp = new JumpLabelDeclaration(MetaData, "");

            jmp.SurroundWith(Env);
            EndLabel.SurroundWith(Env);
            // FEATURE #16
            var conditionType = Condition.GetExpressionType().ToString();

            if (!string.Equals(conditionType, PrimaryType.BoolType, StringComparison.Ordinal))
            {
                Errors.Add(
                    $"{MetaData.GetErrorHeader()}expected a bool as the \"while\" statement\'s condition, " +
                    $"found {conditionType}");
            }
            OkStatementList.Statements.Add(jmp);
            var bodyEnv = new Environment(Env);

            bodyEnv.Declarations.Add(EndLabel);
            OkStatementList.SurroundWith(bodyEnv);
            // FEATURE #17
            if (Pragma.KeepAll || !(Condition is BoolLiteralExpression boolean) || boolean.Value)
            {
                return;
            }
            OptimizedStatementList = new StatementList(MetaData);
            Optimized = 1;
        }
コード例 #2
0
ファイル: WhileExpression.cs プロジェクト: Cm-lang/Cmc
 public WhileExpression(
     MetaData metaData,
     [NotNull] Expression condition,
     [NotNull] StatementList okStatementList,
     [CanBeNull] JumpLabelDeclaration endLabel = null) :
     base(metaData, condition)
 {
     OkStatementList = okStatementList;
     EndLabel        = endLabel ?? new JumpLabelDeclaration(MetaData, "");
 }
コード例 #3
0
        public override void SurroundWith(Environment environment)
        {
            base.SurroundWith(environment);
            var jumpLabel = Env.FindJumpLabelByName(_labelName ?? "");

            if (null == jumpLabel)
            {
                Errors.AddAndThrow($"{MetaData.GetErrorHeader()}cannot return outside a lambda");
            }
            else
            {
                JumpLabel = jumpLabel;
                JumpLabel.StatementsUsingThis.Add(this);
            }
        }