示例#1
0
 public void TestDo()
 {
     var do_ = new Do();
     do_.Init(new Stmt(), new Rel(new Token('>'), new Constant(42), new Constant(99)));
     do_.Gen(10, 20);
     //output:
     //L1:	if 42 > 99 goto L10
 }
示例#2
0
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public Stmt Stmt()
        {
            Expr expr;
            Stmt s1, s2, savedStmt;

            switch (_look.TagValue)
            {
            case ';':
                this.Move();
                return(Sara.Stmt.Null);

            case Tag.IF:
                this.Match(Tag.IF);
                this.Match('(');
                expr = this.Bool();
                this.Match(')');

                s1 = this.Stmt();
                if (_look.TagValue != Tag.ELSE)
                {
                    return(new If(expr, s1));
                }

                this.Match(Tag.ELSE);
                s2 = this.Stmt();
                return(new IfElse(expr, s1, s2));

            case Tag.WHILE:
                var whileNode = new While();
                savedStmt           = Sara.Stmt.Enclosing;
                Sara.Stmt.Enclosing = whileNode;
                this.Match(Tag.WHILE);
                this.Match('(');
                expr = this.Bool();
                this.Match(')');
                s1 = this.Stmt();
                whileNode.Init(expr, s1);
                Sara.Stmt.Enclosing = savedStmt;
                return(whileNode);

            case Tag.DO:
                var doNode = new Do();
                savedStmt           = Sara.Stmt.Enclosing;
                Sara.Stmt.Enclosing = doNode;
                this.Match(Tag.DO);
                s1 = this.Stmt();
                this.Match(Tag.WHILE);
                this.Match('(');
                expr = this.Bool();
                this.Match(')');
                this.Match(';');
                doNode.Init(s1, expr);
                Sara.Stmt.Enclosing = savedStmt;
                return(doNode);

            case Tag.BREAK:
                this.Match(Tag.BREAK);
                this.Match(';');
                return(new Break());

            case '{':
                return(this.Block());

            default:
                return(this.Assign());
            }
        }
示例#3
0
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public Stmt Stmt()
        {
            Expr expr;
            Stmt s1, s2, savedStmt;
            switch(_look.TagValue)
            {
                case ';':
                    this.Move();
                    return Sara.Stmt.Null;

                case Tag.IF:
                    this.Match(Tag.IF);
                    this.Match('(');
                    expr = this.Bool();
                    this.Match(')');
                    
                    s1 = this.Stmt();
                    if (_look.TagValue != Tag.ELSE)
                        return new If(expr, s1);

                    this.Match(Tag.ELSE);
                    s2 = this.Stmt();
                    return new IfElse(expr, s1, s2);

                case Tag.WHILE:
                    var whileNode = new While();
                    savedStmt = Sara.Stmt.Enclosing;
                    Sara.Stmt.Enclosing = whileNode;
                    this.Match(Tag.WHILE);
                    this.Match('(');
                    expr = this.Bool();
                    this.Match(')');
                    s1 = this.Stmt();
                    whileNode.Init(expr, s1);
                    Sara.Stmt.Enclosing = savedStmt;
                    return whileNode;

                case Tag.DO:
                    var doNode = new Do();
                    savedStmt = Sara.Stmt.Enclosing;
                    Sara.Stmt.Enclosing = doNode;
                    this.Match(Tag.DO);
                    s1 = this.Stmt();
                    this.Match(Tag.WHILE);
                    this.Match('(');
                    expr = this.Bool();
                    this.Match(')');
                    this.Match(';');
                    doNode.Init(s1, expr);
                    Sara.Stmt.Enclosing = savedStmt;
                    return doNode;

                case Tag.BREAK:
                    this.Match(Tag.BREAK);
                    this.Match(';');
                    return new Break();

                case '{':
                    return this.Block();

                default:
                    return this.Assign();
            }
        }