grammar: new power operator `**` (starstar)
authorJean Privat <jean@pryen.org>
Thu, 18 Sep 2014 13:58:53 +0000 (09:58 -0400)
committerJean Privat <jean@pryen.org>
Thu, 18 Sep 2014 17:04:51 +0000 (13:04 -0400)
~~~
var a = 2 ** 3 ** 4
~~~

Not yet implemented in the lib because a regeneration of c_src is needed

Signed-off-by: Jean Privat <jean@pryen.org>

src/nitpretty.nit
src/parser/nit.sablecc3xx
src/parser/parser_nodes.nit
src/semantize/typing.nit

index d49f60d..99834a8 100644 (file)
@@ -2228,6 +2228,10 @@ redef class AStarExpr
        redef fun bin_op do return "*"
 end
 
+redef class AStarstarExpr
+       redef fun bin_op do return "**"
+end
+
 redef class AStarshipExpr
        redef fun bin_op do return "<=>"
 end
index cf616b4..e26cf3b 100644 (file)
@@ -162,6 +162,7 @@ dot = '.';
 plus = '+';
 minus = '-';
 star = '*';
+starstar = '**';
 slash = '/';
 percent = '%';
 eq = '==';
@@ -292,6 +293,7 @@ methid {-> methid}
        | {plus} plus {-> New methid.plus(plus)}
        | {minus} minus {-> New methid.minus(minus)}
        | {star} star {-> New methid.star(star)}
+       | {starstar} starstar {-> New methid.starstar(starstar)}
        | {slash} slash {-> New methid.slash(slash)}
        | {percent} percent {-> New methid.percent(percent)}
        | {eq} eq {-> New methid.eq(eq)}
@@ -513,10 +515,15 @@ expr_add~nopar~nobra {-> expr}
        ;
 
 expr_mul~nopar~nobra {-> expr}
+       = expr_pow~nopar~nobra {-> expr_pow~nopar~nobra.expr}
+       | {:star} expr_mul~nopar~nobra :star :no [expr2]:expr_pow~nopar~nobra
+       | {:slash} expr_mul~nopar~nobra :slash :no [expr2]:expr_pow~nopar~nobra
+       | {:percent} expr_mul~nopar~nobra :percent :no [expr2]:expr_pow~nopar~nobra
+       ;
+
+expr_pow~nopar~nobra {-> expr}
        = expr_minus~nopar~nobra {-> expr_minus~nopar~nobra.expr}
-       | {:star} expr_mul~nopar~nobra :star :no [expr2]:expr_minus~nopar~nobra
-       | {:slash} expr_mul~nopar~nobra :slash :no [expr2]:expr_minus~nopar~nobra
-       | {:percent} expr_mul~nopar~nobra :percent :no [expr2]:expr_minus~nopar~nobra
+       | {:starstar} expr_minus~nopar~nobra :starstar :no [expr2]:expr_pow~nopar~nobra
        ;
 
 expr_minus~nopar~nobra {-> expr}
@@ -776,7 +783,7 @@ propdef = {attr} doc? kwredef? visibility kwvar [id2]:id type? expr? annotations
        | {meth} doc? kwredef? visibility kwmeth? kwinit? kwnew? methid? signature annotations? extern_calls? extern_code_block? [block]:expr?
        ;
 
-methid = {id} id | {plus} plus | {minus} minus | {star} star | {slash} slash | {percent} percent | {eq} eq | {ne} ne | {le} le | {ge} ge | {lt} lt | {gt} gt |  {ll} ll | {gg} gg | {bra} obra cbra | {starship} starship | {assign} id assign | {braassign} obra cbra assign;
+methid = {id} id | {plus} plus | {minus} minus | {star} star | {starstar} starstar | {slash} slash | {percent} percent | {eq} eq | {ne} ne | {le} le | {ge} ge | {lt} lt | {gt} gt |  {ll} ll | {gg} gg | {bra} obra cbra | {starship} starship | {assign} id assign | {braassign} obra cbra assign;
 
 signature = opar? [params]:param* cpar? type?;
 
@@ -821,6 +828,7 @@ expr        = {block} expr* kwend?
        | {minus} expr [expr2]:expr 
        | {starship} expr [expr2]:expr 
        | {star} expr [expr2]:expr 
+       | {starstar} expr [expr2]:expr
        | {slash} expr [expr2]:expr 
        | {percent} expr [expr2]:expr 
        | {uminus} minus expr 
index c58937d..187cd34 100644 (file)
@@ -534,6 +534,9 @@ end
 class TStar
        super TokenOperator
 end
+class TStarstar
+       super TokenOperator
+end
 class TSlash
        super TokenOperator
 end
@@ -1031,6 +1034,10 @@ class AStarMethid
        super AMethid
        var n_star: TStar is writable, noinit
 end
+class AStarstarMethid
+       super AMethid
+       var n_starstar: TStarstar is writable, noinit
+end
 class ASlashMethid
        super AMethid
        var n_slash: TSlash is writable, noinit
@@ -1398,6 +1405,11 @@ class AStarExpr
        super ABinopExpr
 end
 
+# A `**` expression
+class AStarstarExpr
+       super ABinopExpr
+end
+
 # A `/` expression
 class ASlashExpr
        super ABinopExpr
index e5f131d..1383302 100644 (file)
@@ -1365,6 +1365,9 @@ end
 redef class AStarExpr
        redef fun property_name do return "*"
 end
+redef class AStarstarExpr
+       redef fun property_name do return "**"
+end
 redef class ASlashExpr
        redef fun property_name do return "/"
 end