private IEnumerable <BaseAst> ConvertFor(ForAst node)
        {
            List <BaseAst> block = new List <BaseAst>();

            internalLabelIdx++;
            int idx = internalLabelIdx;

            block.Add(new BaseAst {
                Token = TokenTypes.Identifier, AstType = AstNodeTypes.Label, TokenText = string.Format("$ForBegin{0}", idx)
            });

            IEnumerable <BaseAst> st = ConvertStatement(node.Init);

            block.AddRange(st);
            node.ConvertInit = st.First();

            block.Add(new BaseAst {
                Token = TokenTypes.Identifier, AstType = AstNodeTypes.Label, TokenText = string.Format("$ForCondition{0}", idx)
            });

            ConditionAst cond = ConvertTo <ConditionAst>(node, AstNodeTypes.Condition);

            cond.Condition = NegateCondition(node.Condition);
            block.Add(cond);
            node.ConvertCondition = cond;

            GotoAst gt = new GotoAst {
                Token = TokenTypes.GotoRW, AstType = AstNodeTypes.Goto, TokenText = "goto", Label = string.Format("$ForEnd{0}", idx)
            };

            block.Add(gt);
            node.ConvertForEndBody = gt;

            block.Add(new BaseAst {
                Token = TokenTypes.Identifier, AstType = AstNodeTypes.Label, TokenText = string.Format("$ForTrue{0}", idx)
            });
            block.AddRange(ConvertStatement(node.ForBody));

            st = ConvertStatement(node.Close);
            block.AddRange(st);
            node.ConvertClose = st.First();
            block.Add(new GotoAst {
                Token = TokenTypes.GotoRW, AstType = AstNodeTypes.Goto, TokenText = "goto", Label = string.Format("$ForCondition{0}", idx)
            });

            block.Add(new BaseAst {
                Token = TokenTypes.Identifier, AstType = AstNodeTypes.Label, TokenText = string.Format("$ForEnd{0}", idx)
            });

            return(block);
        }
Ejemplo n.º 2
0
        private bool ProceedCondition(ConditionAst cond, long[][] mtx, List <string> vars)
        {
            bool isError = false;

            if (cond != null)
            {
                OperatorAst op = cond.Condition as OperatorAst;
                if (op != null)
                {
                    isError = !ProceedPartCondition(op, mtx, vars);
                }
            }

            return(!isError);
        }
        private IEnumerable <BaseAst> ConvertIf(IfAst node)
        {
            List <BaseAst> block = new List <BaseAst>();

            internalLabelIdx++;
            int idx = internalLabelIdx;

            block.Add(new BaseAst {
                Token = TokenTypes.Identifier, AstType = AstNodeTypes.Label, TokenText = string.Format("$IfBegin{0}", idx)
            });

            ConditionAst cond = ConvertTo <ConditionAst>(node, AstNodeTypes.Condition);

            cond.Condition = NegateCondition(node.Condition);
            block.Add(cond);
            node.ConvertCondition = cond;

            if (node.ElseBody != null)
            {
                block.Add(new GotoAst {
                    Token = TokenTypes.GotoRW, AstType = AstNodeTypes.Goto, TokenText = "goto", Label = string.Format("$IfFalse{0}", idx)
                });
            }
            else
            {
                block.Add(new GotoAst {
                    Token = TokenTypes.GotoRW, AstType = AstNodeTypes.Goto, TokenText = "goto", Label = string.Format("$IfEnd{0}", idx)
                });
            }

            block.Add(new BaseAst {
                Token = TokenTypes.Identifier, AstType = AstNodeTypes.Label, TokenText = string.Format("$IfTrue{0}", idx)
            });
            block.AddRange(ConvertStatement(node.IfBody));

            GotoAst gt = new GotoAst {
                Token = TokenTypes.GotoRW, AstType = AstNodeTypes.Goto, TokenText = "goto", Label = string.Format("$IfEnd{0}", idx)
            };

            block.Add(gt);
            node.ConvertIfEndBody = gt;

            if (node.ElseBody != null)
            {
                block.Add(new BaseAst {
                    Token = TokenTypes.Identifier, AstType = AstNodeTypes.Label, TokenText = string.Format("$IfFalse{0}", idx)
                });
                block.AddRange(ConvertStatement(node.ElseBody));

                gt = new GotoAst {
                    Token = TokenTypes.GotoRW, AstType = AstNodeTypes.Goto, TokenText = "goto", Label = string.Format("$IfEnd{0}", idx)
                };
                block.Add(gt);
                node.ConvertElseEndBody = gt;
            }

            block.Add(new BaseAst {
                Token = TokenTypes.Identifier, AstType = AstNodeTypes.Label, TokenText = string.Format("$IfEnd{0}", idx)
            });

            return(block);
        }
 private void PrintSACond(ConditionAst cond)
 {
     Console.WriteLine("    if ({0})", PrintSAExpr(cond.Condition));
 }