From: Jean Privat Date: Sat, 11 Oct 2014 04:27:47 +0000 (-0400) Subject: astbuilder: can make loops and breaks X-Git-Tag: v0.6.10~30^2~3 X-Git-Url: http://nitlanguage.org astbuilder: can make loops and breaks Signed-off-by: Jean Privat --- diff --git a/src/astbuilder.nit b/src/astbuilder.nit index f0e0c95..428a5ca 100644 --- a/src/astbuilder.nit +++ b/src/astbuilder.nit @@ -53,6 +53,12 @@ class ASTBuilder return new ABlockExpr.make end + # Make a new, empty, loop of statements + fun make_loop: ALoopExpr + do + return new ALoopExpr.make + end + # Make a new variable read fun make_var_read(variable: Variable, mtype: MType): AVarExpr do @@ -84,6 +90,12 @@ class ASTBuilder return new ADoExpr.make end + # Make a new break for a given escapemark + fun make_break(escapemark: EscapeMark): ABreakExpr + do + return new ABreakExpr.make(escapemark) + end + # Make a new condinionnal # `mtype` is the return type of the whole if, in case of a ternary operator. fun make_if(condition: AExpr, mtype: nullable MType): AIfExpr @@ -142,6 +154,7 @@ redef class AExpr # Note: this method, aimed to `ABlockExpr` is promoted to `AExpr` because of the limitations of the hierarchies generated by sablecc3 fun add(expr: AExpr) do + print "add not inplemented in {inspect}" abort end end @@ -172,29 +185,54 @@ redef class ABlockExpr end end +redef class ALoopExpr + private init make + do + _n_kwloop = new TKwloop + self.is_typed = true + n_block = new ABlockExpr + n_block.is_typed = true + end + + redef fun add(expr: AExpr) + do + n_block.add expr + end +end + redef class ADoExpr private init make do _n_kwdo = new TKwdo - escapemark = new EscapeMark(null) + self.is_typed = true + n_block = new ABlockExpr + n_block.is_typed = true end # Make a new break expression of the given do fun make_break: ABreakExpr do - var escapemark = self.escapemark + var escapemark = self.break_mark if escapemark == null then escapemark = new EscapeMark(null) - self.escapemark = escapemark + self.break_mark = escapemark end return new ABreakExpr.make(escapemark) end + + redef fun add(expr: AExpr) + do + n_block.add expr + end end redef class ABreakExpr private init make(escapemark: EscapeMark) do + _n_kwbreak = new TKwbreak self.escapemark = escapemark + escapemark.escapes.add self + self.is_typed = true end end