| /******************************************************************************* |
| * Copyright (c) 2010 Luaj.org. All rights reserved. |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a copy |
| * of this software and associated documentation files (the "Software"), to deal |
| * in the Software without restriction, including without limitation the rights |
| * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| * copies of the Software, and to permit persons to whom the Software is |
| * furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included in |
| * all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
| * THE SOFTWARE. |
| ******************************************************************************/ |
| package org.luaj.vm3.ast; |
| |
| import java.util.List; |
| |
| import org.luaj.vm3.ast.Exp.VarExp; |
| |
| abstract |
| public class Stat extends SyntaxElement { |
| public abstract void accept(Visitor visitor); |
| |
| public static Stat block(Block block) { |
| return block; |
| } |
| |
| public static Stat whiledo(Exp exp, Block block) { |
| return new WhileDo(exp, block); |
| } |
| |
| public static Stat repeatuntil(Block block, Exp exp) { |
| return new RepeatUntil(block, exp); |
| } |
| |
| public static Stat breakstat() { |
| return new Break(); |
| } |
| |
| public static Stat returnstat(List<Exp> exps) { |
| return new Return(exps); |
| } |
| |
| public static Stat assignment(List<VarExp> vars, List<Exp> exps) { |
| return new Assign(vars,exps); |
| } |
| |
| public static Stat functioncall(Exp.FuncCall funccall) { |
| return new FuncCallStat(funccall); |
| } |
| |
| public static Stat localfunctiondef(String name, FuncBody funcbody) { |
| return new LocalFuncDef(name, funcbody); |
| } |
| |
| public static Stat fornumeric(String name, Exp initial, Exp limit, Exp step, Block block) { |
| return new NumericFor(name, initial, limit, step, block); |
| } |
| |
| public static Stat functiondef(FuncName funcname, FuncBody funcbody) { |
| return new FuncDef( funcname, funcbody ); |
| } |
| |
| public static Stat forgeneric(List<Name> names, List<Exp> exps, Block block) { |
| return new GenericFor(names, exps, block); |
| } |
| |
| public static Stat localassignment(List<Name> names, List<Exp> values) { |
| return new LocalAssign(names, values); |
| } |
| |
| public static Stat ifthenelse(Exp ifexp, Block ifblock, List<Exp> elseifexps, List<Block> elseifblocks, Block elseblock) { |
| return new IfThenElse(ifexp, ifblock, elseifexps, elseifblocks, elseblock); |
| } |
| |
| public static Stat gotostat(String name) { |
| return new Goto(name); |
| } |
| |
| public static Stat labelstat(String name) { |
| return new Label(name); |
| } |
| |
| public static class Goto extends Stat { |
| public final String name; |
| public Goto(String name) { |
| this.name = name; |
| } |
| public void accept(Visitor visitor) { |
| visitor.visit(this); |
| } |
| } |
| |
| public static class Label extends Stat { |
| public final String name; |
| public Label(String name) { |
| this.name = name; |
| } |
| public void accept(Visitor visitor) { |
| visitor.visit(this); |
| } |
| } |
| |
| public static class Assign extends Stat { |
| public final List<VarExp> vars; |
| public final List<Exp> exps; |
| |
| public Assign(List<VarExp> vars, List<Exp> exps) { |
| this.vars = vars; |
| this.exps = exps; |
| } |
| |
| public void accept(Visitor visitor) { |
| visitor.visit(this); |
| } |
| |
| } |
| |
| public static class WhileDo extends Stat { |
| public final Exp exp; |
| public final Block block; |
| public WhileDo( Exp exp, Block block ) { |
| this.exp = exp; |
| this.block = block; |
| } |
| public void accept(Visitor visitor) { |
| visitor.visit( this ); |
| } |
| } |
| |
| public static class RepeatUntil extends Stat { |
| public final Block block; |
| public final Exp exp; |
| public RepeatUntil( Block block, Exp exp ) { |
| this.block = block; |
| this.exp = exp; |
| } |
| public void accept(Visitor visitor) { |
| visitor.visit( this ); |
| } |
| } |
| |
| public static class Break extends Stat { |
| public void accept(Visitor visitor) { |
| visitor.visit( this ); |
| } |
| } |
| |
| public static class Return extends Stat { |
| public final List<Exp> values; |
| public Return(List<Exp> values) { |
| this.values = values; |
| } |
| |
| public void accept(Visitor visitor) { |
| visitor.visit( this ); |
| } |
| |
| public int nreturns() { |
| int n = values!=null? values.size(): 0; |
| if ( n>0 && ((Exp)values.get(n-1)).isvarargexp() ) |
| n = -1; |
| return n; |
| } |
| } |
| |
| public static class FuncCallStat extends Stat { |
| public final Exp.FuncCall funccall; |
| public FuncCallStat(Exp.FuncCall funccall) { |
| this.funccall = funccall; |
| } |
| |
| public void accept(Visitor visitor) { |
| visitor.visit( this ); |
| } |
| } |
| |
| public static class LocalFuncDef extends Stat { |
| public final Name name; |
| public final FuncBody body; |
| public LocalFuncDef(String name, FuncBody body) { |
| this.name = new Name(name); |
| this.body = body; |
| } |
| |
| public void accept(Visitor visitor) { |
| visitor.visit( this ); |
| } |
| } |
| |
| public static class FuncDef extends Stat { |
| public final FuncName name; |
| public final FuncBody body; |
| public FuncDef(FuncName name, FuncBody body) { |
| this.name = name; |
| this.body = body; |
| } |
| |
| public void accept(Visitor visitor) { |
| visitor.visit( this ); |
| } |
| } |
| |
| public static class GenericFor extends Stat { |
| public List<Name> names; |
| public List<Exp> exps; |
| public Block block; |
| public NameScope scope; |
| public GenericFor(List<Name> names, List<Exp> exps, Block block) { |
| this.names = names; |
| this.exps = exps; |
| this.block = block; |
| } |
| |
| public void accept(Visitor visitor) { |
| visitor.visit( this ); |
| } |
| } |
| |
| public static class NumericFor extends Stat { |
| public final Name name; |
| public final Exp initial,limit,step; |
| public final Block block; |
| public NameScope scope; |
| public NumericFor(String name, Exp initial, Exp limit, Exp step, Block block) { |
| this.name = new Name(name); |
| this.initial = initial; |
| this.limit = limit; |
| this.step = step; |
| this.block = block; |
| } |
| |
| public void accept(Visitor visitor) { |
| visitor.visit( this ); |
| } |
| } |
| |
| public static class LocalAssign extends Stat { |
| public final List<Name> names; |
| public final List<Exp> values; |
| public LocalAssign(List<Name> names, List<Exp> values) { |
| this.names = names; |
| this.values = values; |
| } |
| |
| public void accept(Visitor visitor) { |
| visitor.visit( this ); |
| } |
| } |
| |
| public static class IfThenElse extends Stat { |
| public final Exp ifexp; |
| public final Block ifblock; |
| public final List<Exp> elseifexps; |
| public final List<Block> elseifblocks; |
| public final Block elseblock; |
| public IfThenElse(Exp ifexp, Block ifblock, List<Exp> elseifexps, |
| List<Block> elseifblocks, Block elseblock) { |
| this.ifexp = ifexp; |
| this.ifblock = ifblock; |
| this.elseifexps = elseifexps; |
| this.elseifblocks = elseifblocks; |
| this.elseblock = elseblock; |
| } |
| |
| public void accept(Visitor visitor) { |
| visitor.visit( this ); |
| } |
| } |
| } |