@@ -282,8 +282,8 @@ def _declaration_include(self, node: ET.Element):
282282 def _loop (self , node : ET .Element ):
283283 if node .attrib ['type' ] == 'do' :
284284 return self ._loop_do (node )
285- # elif node.attrib['type'] == 'do-while':
286- # return self._loop_do_while(node)
285+ elif node .attrib ['type' ] == 'do-while' :
286+ return self ._loop_do_while (node )
287287 elif node .attrib ['type' ] == 'forall' :
288288 return self ._loop_forall (node )
289289 else :
@@ -297,7 +297,12 @@ def _loop_do(self, node: ET.Element) -> typed_ast3.For:
297297 return typed_ast3 .For (target = target , iter = iter_ , body = body , orelse = [])
298298
299299 def _loop_do_while (self , node : ET .Element ) -> typed_ast3 .While :
300- pass
300+ header_node = node .find ('./header' )
301+ header = self .transform_all_subnodes (header_node , warn = False )
302+ assert len (header ) == 1
303+ condition = header [0 ]
304+ body = self .transform_all_subnodes (node .find ('./body' ), ignored = {'block' })
305+ return typed_ast3 .While (test = condition , body = body , orelse = [])
301306
302307 def _loop_forall (self , node : ET .Element ) -> typed_ast3 .For :
303308 index_variables = node .find ('./header/index-variables' )
@@ -508,7 +513,7 @@ def _operation_multiary(
508513 operators_and_operands = self .transform_all_subnodes (
509514 node , skip_empty = True , ignored = {
510515 'add-operand__add-op' , 'add-operand' , 'mult-operand__mult-op' , 'mult-operand' ,
511- 'primary' })
516+ 'primary' , 'level-3-expr' })
512517 assert isinstance (operators_and_operands , list ), operators_and_operands
513518 assert len (operators_and_operands ) % 2 == 1 , operators_and_operands
514519
@@ -653,42 +658,76 @@ def _operator(
653658 }[node .attrib ['operator' ].lower ()]
654659
655660 def _array_constructor (self , node : ET .Element ) -> typed_ast3 .ListComp :
656- values = node .findall ('./value' )
657- if len (values ) != 2 :
658- raise NotImplementedError ('not implemented handling of:\n {}' .format (ET .tostring (node ).decode ().rstrip ()))
659- value = values [0 ]
660- sub_values = value .find ('./array-constructor-values' )
661- header_node = value .find ('./header' )
662- header = self .transform_all_subnodes (header_node , warn = False )
661+ value_nodes = node .findall ('./value' )
662+ values = []
663+ for value_node in value_nodes :
664+ value = self .transform_all_subnodes (value_node , warn = False )
665+ if not value :
666+ continue
667+ assert len (value ) == 1
668+ values .append (value [0 ])
669+
670+ if len (values ) != 1 :
671+ raise NotImplementedError (
672+ 'not implemented handling of {} in:\n {}'
673+ .format (values , ET .tostring (node ).decode ().rstrip ()))
674+
675+ header_node = node .find ('./header' )
676+ header = self .transform_all_subnodes (header_node , warn = False , ignored = {'ac-implied-do-control' })
663677 assert len (header ) == 1
664678 comp_target , comp_iter = header [0 ]
665679 return typed_ast3 .ListComp (
666- elt = typed_ast3 .Call (
667- func = typed_ast3 .Name (id = 'do_nothing' , ctx = typed_ast3 .Load ()),
668- args = [], keywords = [], starargs = None , kwargs = None ),
680+ elt = values [0 ],
669681 generators = [
670682 typed_ast3 .comprehension (target = comp_target , iter = comp_iter , ifs = [], is_async = 0 )])
671683
672- # "[ord(c) for line in file for c in line]"
673- #_(elt=Call(func=Name(id='ord', ctx=Load()), args=[
674- # Name(id='c', ctx=Load()),
675- #], keywords=[], starargs=None, kwargs=None), generators=[
676- # comprehension(target=Name(id='line', ctx=Store()), iter=Name(id='file', ctx=Load()), ifs=[], is_async=0),
677- # comprehension(target=Name(id='c', ctx=Store()), iter=Name(id='line', ctx=Load()), ifs=[], is_async=0),
678- #])
684+ def _array_constructor_values (self , node : ET .Element ) -> typed_ast3 .List :
685+ value_nodes = node .findall ('./value' )
686+ values = []
687+ for value_node in value_nodes :
688+ value = self .transform_all_subnodes (value_node , warn = False )
689+ if not value :
690+ continue
691+ assert len (value ) == 1
692+ values .append (value [0 ])
693+
694+ return typed_ast3 .List (elts = values , ctx = typed_ast3 .Load ())
679695
680- def _dimension (self , node : ET .Element ) -> t .Union [typed_ast3 .Num , typed_ast3 .Index ]:
696+ def _dimension (self , node : ET .Element ) -> t .Union [typed_ast3 .Index , typed_ast3 .Slice ]:
681697 dim_type = node .attrib ['type' ]
682698 if dim_type == 'simple' :
683699 values = self .transform_all_subnodes (node , ignored = {'array-spec-element' })
684700 if len (values ) != 1 :
685701 _LOG .error ('simple dimension should have exactly one value, but it has %i' , len (values ))
686702 return typed_ast3 .Index (value = values [0 ])
703+ elif dim_type == 'range' :
704+ lower_bound = node .find ('./lower-bound' )
705+ upper_bound = node .find ('./upper-bound' )
706+ step = node .find ('./step' )
707+ #range_args = []
708+ if lower_bound is not None :
709+ args = self .transform_all_subnodes (lower_bound )
710+ assert len (args ) == 1 , args
711+ #range_args.append(args[0])
712+ lower_bound = args [0 ]
713+ if upper_bound is not None :
714+ args = self .transform_all_subnodes (upper_bound )
715+ assert len (args ) == 1 , args
716+ #range_args.append(typed_ast3.BinOp(
717+ # left=args[0], op=typed_ast3.Add(), right=typed_ast3.Num(n=1)))
718+ upper_bound = args [0 ]
719+ if step is not None :
720+ args = self .transform_all_subnodes (step )
721+ assert len (args ) == 1 , args
722+ #range_args.append(args[0])
723+ step = args [0 ]
724+ return typed_ast3 .Slice (lower = lower_bound , upper = upper_bound , step = step )
687725 elif dim_type == 'assumed-shape' :
688726 return typed_ast3 .Slice (lower = None , upper = None , step = None )
689727 else :
690- _LOG .warning ('%s' , ET .tostring (node ).decode ().rstrip ())
691- raise NotImplementedError ('dimension type "{}" not supported' .format (dim_type ))
728+ raise NotImplementedError (
729+ 'dimension type "{}" not supported in:\n {}'
730+ .format (dim_type , ET .tostring (node ).decode ().rstrip ()))
692731
693732 _basic_types = {
694733 ('logical' , None ): 'bool' ,
0 commit comments