From: Jean Privat Date: Fri, 24 Feb 2012 16:02:59 +0000 (-0500) Subject: parser: include obra and cbra in range nodes X-Git-Tag: v0.5~16^2~8 X-Git-Url: http://nitlanguage.org parser: include obra and cbra in range nodes Signed-off-by: Jean Privat --- diff --git a/src/parser/nit.sablecc3xx b/src/parser/nit.sablecc3xx index caba4aa..651bd4f 100644 --- a/src/parser/nit.sablecc3xx +++ b/src/parser/nit.sablecc3xx @@ -519,8 +519,8 @@ expr_atom~nopar~nobra {-> expr} !nobra | {bra} expr_atom~nopar braargs {-> New expr.bra(expr_atom~nopar.expr, [braargs.expr], [])} | {new} kwnew no type~nobra dot [n2]:no id args {-> New expr.new(kwnew, type~nobra.type, id, [args.expr])} // !nopar to unambiguise 'foo[5].bar' between '(foo[5]).bar' and 'foo([5].bar), -!nobra!nopar | {range} obra no expr [n2]:no dotdot [n3]:no [expr2]:expr_nobra [n4]:no cbra {-> New expr.crange(expr, expr2.expr)} -!nobra!nopar | {orange} obra no expr [n2]:no dotdot [n3]:no [expr2]:expr_nobra [n4]:no [cbra]:obra {-> New expr.orange(expr, expr2.expr)} +!nobra!nopar | {range} obra no expr [n2]:no dotdot [n3]:no [expr2]:expr_nobra [n4]:no cbra {-> New expr.crange(obra, expr, expr2.expr, cbra)} +!nobra!nopar | {orange} obra no expr [n2]:no dotdot [n3]:no [expr2]:expr_nobra [n4]:no [cbra]:obra {-> New expr.orange(obra, expr, expr2.expr, cbra)} !nobra!nopar | {array} braargs {-> New expr.array([braargs.expr])} | {self} kwself {-> New expr.self(kwself)} | {true} kwtrue {-> New expr.true(kwtrue)} @@ -728,8 +728,8 @@ expr = {block} expr* kwend? | {var_assign} id assign [value]:expr | {var_reassign} id assign_op [value]:expr | {range} expr [expr2]:expr - | {crange} expr [expr2]:expr - | {orange} expr [expr2]:expr + | {crange} obra expr [expr2]:expr cbra + | {orange} obra expr [expr2]:expr [cbra]:obra | {array} [exprs]:expr* | {self} kwself | {implicit_self} diff --git a/src/parser/parser.nit b/src/parser/parser.nit index f6f229e..c30d894 100644 --- a/src/parser/parser.nit +++ b/src/parser/parser.nit @@ -11109,13 +11109,19 @@ private class ReduceAction380 var nodearraylist3 = p.pop var nodearraylist2 = p.pop var nodearraylist1 = p.pop - var pexprnode2 = nodearraylist3 - assert pexprnode2 isa nullable AExpr - var pexprnode3 = nodearraylist7 + var tobranode2 = nodearraylist1 + assert tobranode2 isa nullable TObra + var pexprnode3 = nodearraylist3 assert pexprnode3 isa nullable AExpr + var pexprnode4 = nodearraylist7 + assert pexprnode4 isa nullable AExpr + var tcbranode5 = nodearraylist9 + assert tcbranode5 isa nullable TCbra var pexprnode1: nullable ACrangeExpr = new ACrangeExpr.init_acrangeexpr( - pexprnode2, - pexprnode3 + tobranode2, + pexprnode3, + pexprnode4, + tcbranode5 ) node_list = pexprnode1 p.push(p.go_to(_goto), node_list) @@ -11135,13 +11141,19 @@ private class ReduceAction381 var nodearraylist3 = p.pop var nodearraylist2 = p.pop var nodearraylist1 = p.pop - var pexprnode2 = nodearraylist3 - assert pexprnode2 isa nullable AExpr - var pexprnode3 = nodearraylist7 + var tobranode2 = nodearraylist1 + assert tobranode2 isa nullable TObra + var pexprnode3 = nodearraylist3 assert pexprnode3 isa nullable AExpr + var pexprnode4 = nodearraylist7 + assert pexprnode4 isa nullable AExpr + var tobranode5 = nodearraylist9 + assert tobranode5 isa nullable TObra var pexprnode1: nullable AOrangeExpr = new AOrangeExpr.init_aorangeexpr( - pexprnode2, - pexprnode3 + tobranode2, + pexprnode3, + pexprnode4, + tobranode5 ) node_list = pexprnode1 p.push(p.go_to(_goto), node_list) diff --git a/src/parser/parser_abs.nit b/src/parser/parser_abs.nit index 0df601a..e097386 100644 --- a/src/parser/parser_abs.nit +++ b/src/parser/parser_abs.nit @@ -950,13 +950,17 @@ class ARangeExpr end class ACrangeExpr super AExpr + readable var _n_obra: TObra readable var _n_expr: AExpr readable var _n_expr2: AExpr + readable var _n_cbra: TCbra end class AOrangeExpr super AExpr + readable var _n_obra: TObra readable var _n_expr: AExpr readable var _n_expr2: AExpr + readable var _n_cbra: TObra end class AArrayExpr super AExpr diff --git a/src/parser/parser_nodes.nit b/src/parser/parser_nodes.nit index 5745d00..17a8aad 100644 --- a/src/parser/parser_nodes.nit +++ b/src/parser/parser_nodes.nit @@ -1015,9 +1015,13 @@ class ARangeExpr end class ACrangeExpr super ARangeExpr + readable var _n_obra: TObra + readable var _n_cbra: TCbra end class AOrangeExpr super ARangeExpr + readable var _n_obra: TObra + readable var _n_cbra: TObra end class AArrayExpr super AExpr diff --git a/src/parser/parser_prod.nit b/src/parser/parser_prod.nit index 8a2ef72..163d14a 100644 --- a/src/parser/parser_prod.nit +++ b/src/parser/parser_prod.nit @@ -6512,19 +6512,35 @@ redef class ACrangeExpr private init empty_init do end init init_acrangeexpr ( + n_obra: nullable TObra, n_expr: nullable AExpr, - n_expr2: nullable AExpr + n_expr2: nullable AExpr, + n_cbra: nullable TCbra ) do empty_init + _n_obra = n_obra.as(not null) + n_obra.parent = self _n_expr = n_expr.as(not null) n_expr.parent = self _n_expr2 = n_expr2.as(not null) n_expr2.parent = self + _n_cbra = n_cbra.as(not null) + n_cbra.parent = self end redef fun replace_child(old_child: ANode, new_child: nullable ANode) do + if _n_obra == old_child then + if new_child != null then + new_child.parent = self + assert new_child isa TObra + _n_obra = new_child + else + abort + end + return + end if _n_expr == old_child then if new_child != null then new_child.parent = self @@ -6545,31 +6561,59 @@ redef class ACrangeExpr end return end + if _n_cbra == old_child then + if new_child != null then + new_child.parent = self + assert new_child isa TCbra + _n_cbra = new_child + else + abort + end + return + end end redef fun visit_all(v: Visitor) do + v.enter_visit(_n_obra) v.enter_visit(_n_expr) v.enter_visit(_n_expr2) + v.enter_visit(_n_cbra) end end redef class AOrangeExpr private init empty_init do end init init_aorangeexpr ( + n_obra: nullable TObra, n_expr: nullable AExpr, - n_expr2: nullable AExpr + n_expr2: nullable AExpr, + n_cbra: nullable TObra ) do empty_init + _n_obra = n_obra.as(not null) + n_obra.parent = self _n_expr = n_expr.as(not null) n_expr.parent = self _n_expr2 = n_expr2.as(not null) n_expr2.parent = self + _n_cbra = n_cbra.as(not null) + n_cbra.parent = self end redef fun replace_child(old_child: ANode, new_child: nullable ANode) do + if _n_obra == old_child then + if new_child != null then + new_child.parent = self + assert new_child isa TObra + _n_obra = new_child + else + abort + end + return + end if _n_expr == old_child then if new_child != null then new_child.parent = self @@ -6590,12 +6634,24 @@ redef class AOrangeExpr end return end + if _n_cbra == old_child then + if new_child != null then + new_child.parent = self + assert new_child isa TObra + _n_cbra = new_child + else + abort + end + return + end end redef fun visit_all(v: Visitor) do + v.enter_visit(_n_obra) v.enter_visit(_n_expr) v.enter_visit(_n_expr2) + v.enter_visit(_n_cbra) end end redef class AArrayExpr diff --git a/tests/sav/error_expr_not_ok_alt2.sav b/tests/sav/error_expr_not_ok_alt2.sav index 118c7cf..d8bf036 100644 --- a/tests/sav/error_expr_not_ok_alt2.sav +++ b/tests/sav/error_expr_not_ok_alt2.sav @@ -88,12 +88,12 @@ alt/error_expr_not_ok_alt2.nit:134,7--12: Error: Method '[]' doesn't exists in I alt/error_expr_not_ok_alt2.nit:135,1--11: Error: Method '[]=' doesn't exists in Int. alt/error_expr_not_ok_alt2.nit:136,1--12: Error: Method '[]' doesn't exists in Int. alt/error_expr_not_ok_alt2.nit:137,1--17: Error: Method '[]=' doesn't exists in Int. -alt/error_expr_not_ok_alt2.nit:139,8--14: Type error: expected A, got Range[Int] -alt/error_expr_not_ok_alt2.nit:140,8--14: Type error: expected A, got Range[Int] -alt/error_expr_not_ok_alt2.nit:141,8--17: Type error: expected A, got Range[Int] -alt/error_expr_not_ok_alt2.nit:142,8--14: Type error: expected A, got Range[Int] -alt/error_expr_not_ok_alt2.nit:143,8--14: Type error: expected A, got Range[Int] -alt/error_expr_not_ok_alt2.nit:144,8--17: Type error: expected A, got Range[Int] +alt/error_expr_not_ok_alt2.nit:139,7--15: Type error: expected A, got Range[Int] +alt/error_expr_not_ok_alt2.nit:140,7--15: Type error: expected A, got Range[Int] +alt/error_expr_not_ok_alt2.nit:141,7--18: Type error: expected A, got Range[Int] +alt/error_expr_not_ok_alt2.nit:142,7--15: Type error: expected A, got Range[Int] +alt/error_expr_not_ok_alt2.nit:143,7--15: Type error: expected A, got Range[Int] +alt/error_expr_not_ok_alt2.nit:144,7--18: Type error: expected A, got Range[Int] alt/error_expr_not_ok_alt2.nit:145,8--14: Type error: expected A, got Array[Int] alt/error_expr_not_ok_alt2.nit:146,8--14: Type error: expected A, got Array[Int] alt/error_expr_not_ok_alt2.nit:147,8--17: Type error: expected A, got Array[Int] diff --git a/tests/sav/error_expr_not_ok_alt3.sav b/tests/sav/error_expr_not_ok_alt3.sav index a460834..7d5e669 100644 --- a/tests/sav/error_expr_not_ok_alt3.sav +++ b/tests/sav/error_expr_not_ok_alt3.sav @@ -87,12 +87,12 @@ alt/error_expr_not_ok_alt3.nit:134,7--12: Error: Method '[]' doesn't exists in I alt/error_expr_not_ok_alt3.nit:135,1--11: Error: Method '[]=' doesn't exists in Int. alt/error_expr_not_ok_alt3.nit:136,1--12: Error: Method '[]' doesn't exists in Int. alt/error_expr_not_ok_alt3.nit:137,1--17: Error: Method '[]=' doesn't exists in Int. -alt/error_expr_not_ok_alt3.nit:139,8--14: Type error: expected A, got Range[Int] -alt/error_expr_not_ok_alt3.nit:140,8--14: Type error: expected A, got Range[Int] -alt/error_expr_not_ok_alt3.nit:141,8--17: Type error: expected A, got Range[Int] -alt/error_expr_not_ok_alt3.nit:142,8--14: Type error: expected A, got Range[Int] -alt/error_expr_not_ok_alt3.nit:143,8--14: Type error: expected A, got Range[Int] -alt/error_expr_not_ok_alt3.nit:144,8--17: Type error: expected A, got Range[Int] +alt/error_expr_not_ok_alt3.nit:139,7--15: Type error: expected A, got Range[Int] +alt/error_expr_not_ok_alt3.nit:140,7--15: Type error: expected A, got Range[Int] +alt/error_expr_not_ok_alt3.nit:141,7--18: Type error: expected A, got Range[Int] +alt/error_expr_not_ok_alt3.nit:142,7--15: Type error: expected A, got Range[Int] +alt/error_expr_not_ok_alt3.nit:143,7--15: Type error: expected A, got Range[Int] +alt/error_expr_not_ok_alt3.nit:144,7--18: Type error: expected A, got Range[Int] alt/error_expr_not_ok_alt3.nit:145,8--14: Type error: expected A, got Array[Int] alt/error_expr_not_ok_alt3.nit:146,8--14: Type error: expected A, got Array[Int] alt/error_expr_not_ok_alt3.nit:147,8--17: Type error: expected A, got Array[Int] diff --git a/tests/sav/error_expr_not_ok_alt4.sav b/tests/sav/error_expr_not_ok_alt4.sav index 5978eb1..09da141 100644 --- a/tests/sav/error_expr_not_ok_alt4.sav +++ b/tests/sav/error_expr_not_ok_alt4.sav @@ -91,12 +91,12 @@ alt/error_expr_not_ok_alt4.nit:134,7--12: Error: Method '[]' doesn't exists in I alt/error_expr_not_ok_alt4.nit:135,1--11: Error: Method '[]=' doesn't exists in Int. alt/error_expr_not_ok_alt4.nit:136,1--12: Error: Method '[]' doesn't exists in Int. alt/error_expr_not_ok_alt4.nit:137,1--17: Error: Method '[]=' doesn't exists in Int. -alt/error_expr_not_ok_alt4.nit:139,8--14: Type error: expected A, got Range[Int] -alt/error_expr_not_ok_alt4.nit:140,8--14: Type error: expected A, got Range[Int] -alt/error_expr_not_ok_alt4.nit:141,8--17: Type error: expected A, got Range[Int] -alt/error_expr_not_ok_alt4.nit:142,8--14: Type error: expected A, got Range[Int] -alt/error_expr_not_ok_alt4.nit:143,8--14: Type error: expected A, got Range[Int] -alt/error_expr_not_ok_alt4.nit:144,8--17: Type error: expected A, got Range[Int] +alt/error_expr_not_ok_alt4.nit:139,7--15: Type error: expected A, got Range[Int] +alt/error_expr_not_ok_alt4.nit:140,7--15: Type error: expected A, got Range[Int] +alt/error_expr_not_ok_alt4.nit:141,7--18: Type error: expected A, got Range[Int] +alt/error_expr_not_ok_alt4.nit:142,7--15: Type error: expected A, got Range[Int] +alt/error_expr_not_ok_alt4.nit:143,7--15: Type error: expected A, got Range[Int] +alt/error_expr_not_ok_alt4.nit:144,7--18: Type error: expected A, got Range[Int] alt/error_expr_not_ok_alt4.nit:145,8--14: Type error: expected A, got Array[Int] alt/error_expr_not_ok_alt4.nit:146,8--14: Type error: expected A, got Array[Int] alt/error_expr_not_ok_alt4.nit:147,8--17: Type error: expected A, got Array[Int] diff --git a/tests/sav/error_expr_not_ok_alt5.sav b/tests/sav/error_expr_not_ok_alt5.sav index 4ebaba9..07d2cf6 100644 --- a/tests/sav/error_expr_not_ok_alt5.sav +++ b/tests/sav/error_expr_not_ok_alt5.sav @@ -92,12 +92,12 @@ alt/error_expr_not_ok_alt5.nit:134,7--12: Error: Method '[]' doesn't exists in I alt/error_expr_not_ok_alt5.nit:135,1--11: Error: Method '[]=' doesn't exists in Int. alt/error_expr_not_ok_alt5.nit:136,1--12: Error: Method '[]' doesn't exists in Int. alt/error_expr_not_ok_alt5.nit:137,1--17: Error: Method '[]=' doesn't exists in Int. -alt/error_expr_not_ok_alt5.nit:139,8--14: Type error: expected A, got Range[Int] -alt/error_expr_not_ok_alt5.nit:140,8--14: Type error: expected A, got Range[Int] -alt/error_expr_not_ok_alt5.nit:141,8--17: Type error: expected A, got Range[Int] -alt/error_expr_not_ok_alt5.nit:142,8--14: Type error: expected A, got Range[Int] -alt/error_expr_not_ok_alt5.nit:143,8--14: Type error: expected A, got Range[Int] -alt/error_expr_not_ok_alt5.nit:144,8--17: Type error: expected A, got Range[Int] +alt/error_expr_not_ok_alt5.nit:139,7--15: Type error: expected A, got Range[Int] +alt/error_expr_not_ok_alt5.nit:140,7--15: Type error: expected A, got Range[Int] +alt/error_expr_not_ok_alt5.nit:141,7--18: Type error: expected A, got Range[Int] +alt/error_expr_not_ok_alt5.nit:142,7--15: Type error: expected A, got Range[Int] +alt/error_expr_not_ok_alt5.nit:143,7--15: Type error: expected A, got Range[Int] +alt/error_expr_not_ok_alt5.nit:144,7--18: Type error: expected A, got Range[Int] alt/error_expr_not_ok_alt5.nit:145,8--14: Type error: expected A, got Array[Int] alt/error_expr_not_ok_alt5.nit:146,8--14: Type error: expected A, got Array[Int] alt/error_expr_not_ok_alt5.nit:147,8--17: Type error: expected A, got Array[Int] diff --git a/tests/sav/error_expr_not_ok_alt6.sav b/tests/sav/error_expr_not_ok_alt6.sav index e7dec16..b20329d 100644 --- a/tests/sav/error_expr_not_ok_alt6.sav +++ b/tests/sav/error_expr_not_ok_alt6.sav @@ -109,11 +109,11 @@ alt/error_expr_not_ok_alt6.nit:134,7--12: Error: Method '[]' call on 'null'. alt/error_expr_not_ok_alt6.nit:135,1--11: Error: Method '[]=' call on 'null'. alt/error_expr_not_ok_alt6.nit:136,1--12: Error: Method '[]' call on 'null'. alt/error_expr_not_ok_alt6.nit:137,1--17: Error: Method '[]=' call on 'null'. -alt/error_expr_not_ok_alt6.nit:139,8--14: Type error: Int incompatible with null. -alt/error_expr_not_ok_alt6.nit:140,8--14: Type error: null incompatible with Int. +alt/error_expr_not_ok_alt6.nit:139,7--15: Type error: Int incompatible with null. +alt/error_expr_not_ok_alt6.nit:140,7--15: Type error: null incompatible with Int. alt/error_expr_not_ok_alt6.nit:141,8--11: Type error: expected Discrete, got null -alt/error_expr_not_ok_alt6.nit:142,8--14: Type error: Int incompatible with null. -alt/error_expr_not_ok_alt6.nit:143,8--14: Type error: null incompatible with Int. +alt/error_expr_not_ok_alt6.nit:142,7--15: Type error: Int incompatible with null. +alt/error_expr_not_ok_alt6.nit:143,7--15: Type error: null incompatible with Int. alt/error_expr_not_ok_alt6.nit:144,8--11: Type error: expected Discrete, got null alt/error_expr_not_ok_alt6.nit:145,8--14: Type error: expected A, got Array[nullable Int] alt/error_expr_not_ok_alt6.nit:146,8--14: Type error: expected A, got Array[nullable Int] diff --git a/tests/sav/test_parser_args1.sav b/tests/sav/test_parser_args1.sav index a563022..e25dc74 100644 --- a/tests/sav/test_parser_args1.sav +++ b/tests/sav/test_parser_args1.sav @@ -4449,7 +4449,8 @@ ../src/syntax/typing.nit:756,3--758,5 keyword 'for' ... ../src/syntax/typing.nit:756,3--5 identifier 'i' ... ../src/syntax/typing.nit:756,7 - ../src/syntax/typing.nit:756,13--25 + ../src/syntax/typing.nit:756,12--26 + '[' ... ../src/syntax/typing.nit:756,12 ../src/syntax/typing.nit:756,13 literal value '0' ... ../src/syntax/typing.nit:756,13 ../src/syntax/typing.nit:756,16--25 @@ -4457,6 +4458,7 @@ ../src/syntax/typing.nit:756,16 identifier 'vas' ... ../src/syntax/typing.nit:756,16--18 identifier 'length' ... ../src/syntax/typing.nit:756,20--25 + '[' ... ../src/syntax/typing.nit:756,26 keyword 'do' ... ../src/syntax/typing.nit:756,28--29 ../src/syntax/typing.nit:757,4--758,5 ../src/syntax/typing.nit:757,4--24 @@ -8711,12 +8713,14 @@ ../src/syntax/typing.nit:1437,3--1451,5 keyword 'for' ... ../src/syntax/typing.nit:1437,3--5 identifier 'par_idx' ... ../src/syntax/typing.nit:1437,7--13 - ../src/syntax/typing.nit:1437,19--30 + ../src/syntax/typing.nit:1437,18--31 + '[' ... ../src/syntax/typing.nit:1437,18 ../src/syntax/typing.nit:1437,19 literal value '0' ... ../src/syntax/typing.nit:1437,19 ../src/syntax/typing.nit:1437,22--30 ../src/syntax/typing.nit:1437,22 identifier 'par_arity' ... ../src/syntax/typing.nit:1437,22--30 + '[' ... ../src/syntax/typing.nit:1437,31 keyword 'do' ... ../src/syntax/typing.nit:1437,33--34 ../src/syntax/typing.nit:1438,4--1451,5 ../src/syntax/typing.nit:1438,4--15 @@ -8748,7 +8752,8 @@ ../src/syntax/typing.nit:1441,5--1445,7 keyword 'for' ... ../src/syntax/typing.nit:1441,5--7 identifier 'i' ... ../src/syntax/typing.nit:1441,9 - ../src/syntax/typing.nit:1441,15--38 + ../src/syntax/typing.nit:1441,14--39 + '[' ... ../src/syntax/typing.nit:1441,14 ../src/syntax/typing.nit:1441,15 literal value '0' ... ../src/syntax/typing.nit:1441,15 ../src/syntax/typing.nit:1441,18--38 @@ -8761,6 +8766,7 @@ ../src/syntax/typing.nit:1441,29 identifier 'par_arity' ... ../src/syntax/typing.nit:1441,29--37 ')' ... ../src/syntax/typing.nit:1441,38 + ']' ... ../src/syntax/typing.nit:1441,39 keyword 'do' ... ../src/syntax/typing.nit:1441,41--42 ../src/syntax/typing.nit:1442,6--1445,7 ../src/syntax/typing.nit:1442,6--25 @@ -9100,12 +9106,14 @@ ../src/syntax/typing.nit:1480,5--1498,7 keyword 'for' ... ../src/syntax/typing.nit:1480,5--7 identifier 'i' ... ../src/syntax/typing.nit:1480,9 - ../src/syntax/typing.nit:1480,15--22 + ../src/syntax/typing.nit:1480,14--23 + '[' ... ../src/syntax/typing.nit:1480,14 ../src/syntax/typing.nit:1480,15 literal value '0' ... ../src/syntax/typing.nit:1480,15 ../src/syntax/typing.nit:1480,18--22 ../src/syntax/typing.nit:1480,18 identifier 'arity' ... ../src/syntax/typing.nit:1480,18--22 + '[' ... ../src/syntax/typing.nit:1480,23 keyword 'do' ... ../src/syntax/typing.nit:1480,25--26 ../src/syntax/typing.nit:1481,6--1498,7 ../src/syntax/typing.nit:1481,6--19 @@ -13013,7 +13021,8 @@ ../src/syntax/typing.nit:2000,3--2005,5 keyword 'for' ... ../src/syntax/typing.nit:2000,3--5 identifier 'i' ... ../src/syntax/typing.nit:2000,7 - ../src/syntax/typing.nit:2000,13--27 + ../src/syntax/typing.nit:2000,12--28 + '[' ... ../src/syntax/typing.nit:2000,12 ../src/syntax/typing.nit:2000,13 literal value '0' ... ../src/syntax/typing.nit:2000,13 ../src/syntax/typing.nit:2000,16--27 @@ -13021,6 +13030,7 @@ ../src/syntax/typing.nit:2000,16 identifier 'n_ids' ... ../src/syntax/typing.nit:2000,16--20 identifier 'length' ... ../src/syntax/typing.nit:2000,22--27 + '[' ... ../src/syntax/typing.nit:2000,28 keyword 'do' ... ../src/syntax/typing.nit:2000,30--31 ../src/syntax/typing.nit:2001,4--2005,5 ../src/syntax/typing.nit:2001,4--56