grammar: keep operators in the AST for better messages
authorJean Privat <jean@pryen.org>
Wed, 15 Apr 2015 04:09:18 +0000 (11:09 +0700)
committerJean Privat <jean@pryen.org>
Wed, 15 Apr 2015 05:43:57 +0000 (12:43 +0700)
Signed-off-by: Jean Privat <jean@pryen.org>

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

index 95bd1c2..0e17804 100644 (file)
@@ -501,10 +501,10 @@ expr~nopar~nobra {-> expr}
 
 expr_and~nopar~nobra {-> expr}
        = expr_not~nopar~nobra {-> expr_not~nopar~nobra.expr}
-       | {:or} expr_and~nopar~nobra :kwor :no expr_not~nopar~nobra
-       | {:and} expr_and~nopar~nobra :kwand :no expr_not~nopar~nobra
-       | {:or_else} expr_and~nopar~nobra :kwor :kwelse :no expr_not~nopar~nobra
-       | {:implies} expr_and~nopar~nobra :kwimplies :no expr_not~nopar~nobra
+       | {:or} expr_and~nopar~nobra kwor :no expr_not~nopar~nobra
+       | {:and} expr_and~nopar~nobra kwand :no expr_not~nopar~nobra
+       | {:or_else} expr_and~nopar~nobra kwor kwelse :no expr_not~nopar~nobra
+       | {:implies} expr_and~nopar~nobra kwimplies :no expr_not~nopar~nobra
        ;
 
 expr_not~nopar~nobra {-> expr}
@@ -514,34 +514,34 @@ expr_not~nopar~nobra {-> expr}
 
 expr_eq~nopar~nobra {-> expr}
        = expr_add~nopar~nobra {-> expr_add~nopar~nobra.expr}
-       | {:eq} expr_add~nopar~nobra :eq :no [expr2]:expr_add~nopar~nobra
-       | {:ne} expr_add~nopar~nobra :ne :no [expr2]:expr_add~nopar~nobra
-       | {:lt} expr_add~nopar~nobra :lt :no [expr2]:expr_add~nopar~nobra
-       | {:le} expr_add~nopar~nobra :le :no [expr2]:expr_add~nopar~nobra
-       | {:ll} expr_eq~nopar~nobra :ll :no [expr2]:expr_add~nopar~nobra
-       | {:gt} expr_add~nopar~nobra :gt :no [expr2]:expr_add~nopar~nobra
-       | {:ge} expr_add~nopar~nobra :ge :no [expr2]:expr_add~nopar~nobra
-       | {:gg} expr_eq~nopar~nobra :gg :no [expr2]:expr_add~nopar~nobra
-       | {:starship} expr_add~nopar~nobra :starship :no [expr2]:expr_add~nopar~nobra
-       | {:isa} expr_add~nopar~nobra :kwisa :no type~nobra
+       | {:eq} expr_add~nopar~nobra eq :no [expr2]:expr_add~nopar~nobra
+       | {:ne} expr_add~nopar~nobra ne :no [expr2]:expr_add~nopar~nobra
+       | {:lt} expr_add~nopar~nobra lt :no [expr2]:expr_add~nopar~nobra
+       | {:le} expr_add~nopar~nobra le :no [expr2]:expr_add~nopar~nobra
+       | {:ll} expr_eq~nopar~nobra ll :no [expr2]:expr_add~nopar~nobra
+       | {:gt} expr_add~nopar~nobra gt :no [expr2]:expr_add~nopar~nobra
+       | {:ge} expr_add~nopar~nobra ge :no [expr2]:expr_add~nopar~nobra
+       | {:gg} expr_eq~nopar~nobra gg :no [expr2]:expr_add~nopar~nobra
+       | {:starship} expr_add~nopar~nobra starship :no [expr2]:expr_add~nopar~nobra
+       | {:isa} expr_add~nopar~nobra kwisa :no type~nobra
        ;
 
 expr_add~nopar~nobra {-> expr}
        =  expr_mul~nopar~nobra {-> expr_mul~nopar~nobra.expr}
-       | {:plus} expr_add~nopar~nobra :plus :no [expr2]:expr_mul~nopar~nobra
-       | {:minus} expr_add~nopar~nobra :minus :no [expr2]:expr_mul~nopar~nobra
+       | {:plus} expr_add~nopar~nobra plus :no [expr2]:expr_mul~nopar~nobra
+       | {:minus} expr_add~nopar~nobra minus :no [expr2]:expr_mul~nopar~nobra
        ;
 
 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
+       | {: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}
-       | {:starstar} expr_minus~nopar~nobra :starstar :no [expr2]:expr_pow~nopar~nobra
+       | {:starstar} expr_minus~nopar~nobra starstar :no [expr2]:expr_pow~nopar~nobra
        ;
 
 expr_minus~nopar~nobra {-> expr}
@@ -862,27 +862,27 @@ expr      = {block} expr* kwend?
        | {once} kwonce expr 
        | {send} expr 
        | {binop} expr [expr2]:expr 
-       | {or} expr [expr2]:expr 
-       | {and} expr [expr2]:expr 
-       | {or_else} expr [expr2]:expr
-       | {implies} expr [expr2]:expr
-       | {not} kwnot expr 
-       | {eq} expr [expr2]:expr 
-       | {ne} expr [expr2]:expr 
-       | {lt} expr [expr2]:expr 
-       | {le} expr [expr2]:expr 
-       | {ll} expr [expr2]:expr
-       | {gt} expr [expr2]:expr 
-       | {ge} expr [expr2]:expr 
-       | {gg} expr [expr2]:expr
-       | {isa} expr type 
-       | {plus} expr [expr2]:expr 
-       | {minus} expr [expr2]:expr 
-       | {starship} expr [expr2]:expr 
-       | {star} expr [expr2]:expr 
-       | {starstar} expr [expr2]:expr
-       | {slash} expr [expr2]:expr 
-       | {percent} expr [expr2]:expr 
+       | {or} expr [op]:kwor [expr2]:expr
+       | {and} expr [op]:kwand [expr2]:expr
+       | {or_else} expr [op]:kwor kwelse [expr2]:expr
+       | {implies} expr [op]:kwimplies [expr2]:expr
+       | {not} kwnot expr
+       | {eq} expr [op]:eq [expr2]:expr
+       | {ne} expr [op]:ne [expr2]:expr
+       | {lt} expr [op]:lt [expr2]:expr
+       | {le} expr [op]:le [expr2]:expr
+       | {ll} expr [op]:ll [expr2]:expr
+       | {gt} expr [op]:gt [expr2]:expr
+       | {ge} expr [op]:ge [expr2]:expr
+       | {gg} expr [op]:gg [expr2]:expr
+       | {isa} expr kwisa type
+       | {plus} expr [op]:plus [expr2]:expr
+       | {minus} expr [op]:minus [expr2]:expr
+       | {starship} expr [op]:starship [expr2]:expr
+       | {star} expr [op]:star [expr2]:expr
+       | {starstar} expr [op]:starstar [expr2]:expr
+       | {slash} expr [op]:slash [expr2]:expr
+       | {percent} expr [op]:percent [expr2]:expr
        | {uminus} minus expr 
        | {uplus} plus expr
        | {new} kwnew type id? [args]:exprs
index 6df4943..076825e 100644 (file)
@@ -1879,6 +1879,10 @@ end
 # A binary operation on a method
 abstract class ABinopExpr
        super ASendExpr
+
+       # The operator
+       var n_op: Token is writable, noinit
+
        # The second operand of the operation
        # Note: the receiver (`n_expr`) is the first operand
        var n_expr2: AExpr is writable, noinit
@@ -1896,6 +1900,9 @@ abstract class ABinBoolExpr
        # The first boolean operand
        var n_expr: AExpr is writable, noinit
 
+       # The operator
+       var n_op: Token is writable, noinit
+
        # The second boolean operand
        var n_expr2: AExpr is writable, noinit
 end
@@ -1913,6 +1920,9 @@ end
 # A `or else` expression
 class AOrElseExpr
        super ABinBoolExpr
+
+       # The `else` keyword
+       var n_kwelse: TKwelse is writable, noinit
 end
 
 # A `implies` expression
@@ -1978,6 +1988,9 @@ class AIsaExpr
        # The expression to check
        var n_expr: AExpr is writable, noinit
 
+       # The `isa` keyword
+       var n_kwisa: TKwisa is writable, noinit
+
        # The destination type to check to
        var n_type: AType is writable, noinit
 end