ast: accept methodid in at_args
authorJean Privat <jean@pryen.org>
Fri, 17 Oct 2014 02:33:37 +0000 (22:33 -0400)
committerJean Privat <jean@pryen.org>
Tue, 21 Oct 2014 23:51:01 +0000 (19:51 -0400)
Signed-off-by: Jean Privat <jean@pryen.org>

src/parser/nit.sablecc3xx
src/parser/parser_nodes.nit

index 2e15312..99d9be5 100644 (file)
@@ -288,9 +288,8 @@ visibility
        | {intrude} kwintrude no {-> New visibility.intrude(kwintrude)}
        ;
 
-methid {-> methid}
-       = {id} id {-> New methid.id(id)}
-       | {plus} plus {-> New methid.plus(plus)}
+methid~noid {-> 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)}
@@ -308,6 +307,7 @@ methid {-> methid}
        | {starship} starship {-> New methid.starship(starship)}
        | {assign} id assign {-> New methid.assign(id, assign)}
        | {braassign} obra cbra assign {-> New methid.braassign(obra, cbra, assign)}
+!noid  | {id} id {-> New methid.id(id)}
        ;
 
 signature {-> signature}
@@ -524,7 +524,7 @@ expr_pow~nopar~nobra {-> expr}
 
 expr_minus~nopar~nobra {-> expr}
        = expr_new~nopar~nobra {-> expr_new~nopar~nobra.expr}
-       | {:uminus} minus :no expr_minus~nobra
+       | {:uminus} minus expr_minus~nobra
        | {:once} kwonce :no expr_minus~nobra
        ;
 
@@ -665,6 +665,7 @@ any_expr~nopar {-> expr}
        = {type} type {-> New expr.type(type)}
        | {expr} expr~nopar {-> expr~nopar.expr}
        | {stmt} stmt_noexpr~nopar {-> stmt_noexpr~nopar.expr}
+       | {methid} recv~nopar qmethid_noid {-> New expr.methid(recv~nopar.expr, qmethid_noid.methid)}
 !nopar | {at} annotations {-> New expr.at(annotations.annotations)}
        ;
 
@@ -683,9 +684,12 @@ recv~nopar~nobra {-> expr}
        ;
 
 args {-> exprs}
+       = args_n {-> args_n.exprs}
+       | {empty} {-> New exprs.list([])}
+       ;
+args_n {-> exprs}
        = opar no expr_list cpar {-> New exprs.par(opar, [expr_list.expr], cpar) }
        | {emptypar} opar no cpar {-> New exprs.par(opar, [], cpar) }
-       | {empty} {-> New exprs.list([])}
        ;
 args_nopar {-> exprs}
        = opar no expr_list cpar {-> New exprs.par(opar, [expr_list.expr], cpar) }
@@ -851,7 +855,7 @@ expr        = {block} expr* kwend?
        | {attr_assign} expr [id]:attrid assign [value]:expr 
        | {attr_reassign} expr [id]:attrid assign_op [value]:expr 
        | {call} expr id [args]:exprs
-       | {call_assign} expr id [args]:exprs assign [value]:expr 
+       | {call_assign} expr id [args]:exprs assign [value]:expr
        | {call_reassign} expr id [args]:exprs assign_op [value]:expr 
        | {super} qualified? kwsuper [args]:exprs
        | {init} expr kwinit [args]:exprs 
@@ -886,6 +890,7 @@ expr        = {block} expr* kwend?
        | {debug_type} kwdebug kwtype expr type
        | {vararg} expr dotdotdot
        | {type} type
+       | {methid} expr [id]:methid
        | {at} annotations
        | {many} [exprs]:expr*
        ;
index 8793a00..504dcbb 100644 (file)
@@ -1910,6 +1910,15 @@ class ATypeExpr
        var n_type: AType is writable, noinit
 end
 
+# A special expression that encapsulates a method identifier
+# Can only be found in special construction like arguments of annotations.
+class AMethidExpr
+       super AExpr
+       # The receiver, is any
+       var n_expr: AExpr is writable, noinit
+       var n_id: AMethid is writable, noinit
+end
+
 # A special expression that encapsulate an annotation
 # Can only be found in special construction like arguments of annotations.
 class AAtExpr