B
    d                @   s  d dl mZmZmZ d dlmZ d dlmZmZm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ d dlZd d	lmZ G d
d deZG dd deZG dd deZG dd deZdd ZG dd deZdd ZG dd deZdd Zdd Zddd Zdd!d"Zd#d$ Zd%d& Z G d'd( d(eZ!G d)d* d*eZ"G d+d, d,eZ#G d-d. d.eZ$G d/d0 d0eZ%G d1d2 d2eZ&G d3d4 d4eZ'G d5d6 d6eZ(G d7d8 d8eZ)G d9d: d:eZ*G d;d< d<eZ+G d=d> d>eZ,G d?d@ d@eZ-G dAdB dBeZ.G dCdD dDeZ/dEdF Z0dG1 Z2ddHdIZ3ddJdKZ4dLdM Z5ddNdOZ6dPdQ Z7dRdS Z8G dTdU dUeZ9dVdW Z:G dXdY dYe9Z;G dZd[ d[e9Z<G d\d] d]e9Z=G d^d_ d_e9Z>G d`da dae9Z?G dbdc dce9Z@G ddde dee9ZAG dfdg dge9ZBG dhdi die9ZCG djdk dke9ZDG dldm dme9ZEG dndo doe9ZFG dpdq dqe9ZGG drds dse9ZHG dtdu due9ZIG dvdw dwe9ZJG dxdy dye9ZKG dzd{ d{e9ZLG d|d} d}e9ZMG d~d de9ZNG dd de9ZOG dd de9ZPG dd de9ZQG dd de9ZRG dd de9ZSG dd de9ZTG dd de9ZUG dd de9ZVG dd de9ZW[:G dd deZXdd ZYG dd deZZG dd deZ[G dd deZ\G dd deZ]G dd deZ^dd Z_G dd deXZ`G dd deZaG dd deZbG dd deZcG dd deZddddZedS )    )absolute_importdivisionprint_function)range)unsigned_integer_scanidentifier_scanfind_closing_parenthesisSemanticError)tokenization)
intrinsics)equivalence)utilsN)zipc               @   s   e Zd ZdS )ErrorN)__name__
__module____qualname__ r   r   i/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/fable/read.pyr      s    r   c               @   sT   e Zd Zg Zdd ZdddZdddZdd	d
ZdddZdddZ	dddZ
dS )raise_errors_mixinc             C   s2   |  |\}}|d k	r*|jd k	r*||j7 }||fS )N)stmt_location	stmt_offs)Oislr   r   r   text_location   s    
z raise_errors_mixin.text_location c                s   |  |\}}ddlm} ||jd\}}|d kr8d}nN|dk rd| d }	|d|	t| d  7 }n||j|  }	ddd	|	   d
 }|d krd}
nd| }
d|
| ||f } d ks dkr|S d fdd| D S )Nr   )expandtabs_track_columns)sr       
-   ^z	%s:
  at z%s%s:
  |%s|%sc                s   g | ]} |   qS r   )rstrip).0line)prefixr   r   
<listcomp>.   s   z3raise_errors_mixin.format_error.<locals>.<listcomp>)	r   libtbx.str_utilsr   textlenr    format_file_name_and_line_numberjoin
splitlines)r   r   msgr(   r   r   tjsptrjintroresultr   )r(   r   format_error   s&    
 zraise_errors_mixin.format_errorNc             C   s"   |d krt }|| j||dd S )N)r   r0   )r   r7   )r   r0   r   	ErrorTyper   r   r   raise_error1   s     zraise_errors_mixin.raise_errorc             C   s   | j d|d d S )NzSyntax error)r0   r   )r9   )r   r   r   r   r   raise_syntax_error5   s    z%raise_errors_mixin.raise_syntax_errorc             C   s   | j d|d d S )NzSyntax error or not implemented)r0   r   )r9   )r   r   r   r   r   %raise_syntax_error_or_not_implemented8   s    z8raise_errors_mixin.raise_syntax_error_or_not_implementedc             C   s   | j ||td d S )N)r0   r   r8   )r9   r	   )r   r0   r   r   r   r   raise_semantic_error;   s    z'raise_errors_mixin.raise_semantic_errorc             C   s   | j d|td d S )NzSorry: fable internal error)r0   r   r8   )r9   AssertionError)r   r   r   r   r   raise_internal_error>   s    z'raise_errors_mixin.raise_internal_error)r   )NN)N)N)NN)N)r   r   r   	__slots__r   r7   r9   r:   r;   r<   r>   r   r   r   r   r      s   




r   c            	   @   s:   e Zd Zddddddddd	g	Zd
d Zdd Zdd ZdS )source_lineglobal_line_index	file_nameline_numberr+   labelstmtr   is_contindex_of_exclamation_markc             C   s   d| j | jf S )Nz%s(%d))rB   rC   )r   r   r   r   r-   O   s    z,source_line.format_file_name_and_line_numberc             C   s   | |fS )Nr   )r   r   r   r   r   r   R   s    zsource_line.stmt_locationc       
      C   st  t || _|| _|| _|| _d | _d| _d | _|ddd}|dkrp|d }d| _	|d | 
 }||d }nFd}|dd }	|	d	ko|	dko|	dk| _	|d d 
 }|dd }t|dkrt|dkr|| _|| _nlt|d
}|dk s|t|krd| _	nD| j	r| jddd || _t|dkr<| jddd || _|| _| j	sjt| j dkrjd | _d | _d S )Nr   	r      r   FH      r    )codezDA continuation character is illegal on a line with a statement labeli)r0   r   zLabelled statement is emptyi)nextrA   rB   rC   r+   rD   rE   r   findrF   stripr,   r   r9   r%   rG   )
r   global_line_index_generatorrB   rC   r+   r   Zsofflr   cr   r   r   __init__U   sJ    

zsource_line.__init__N)r   r   r   r?   r-   r   rS   r   r   r   r   r@   B   s   r@   c               @   sl   e Zd ZddddddddgZd	d
 Zdd Zdd Zdd Zdd Zdd Z	dd Z
dddZdddZdS )stripped_source_linesource_line_clusterrD   code0_locationsstartrL   stringsstrings_locsstring_indicesc       	      C   s   |d kr|d ks>t n(t|dks&t t||t| ks>t t|t|ksRt || _d | _x"| jD ]}|jd k	rf|j| _P qfW || _|| _|| _|| _|| _|| _	d S )Nr   )
r=   r,   rU   rD   rV   rW   rL   rX   rY   rZ   )	r   rU   rV   rL   rW   rX   rY   rZ   r   r   r   r   rS      s"    
zstripped_source_line.__init__c             C   sp   g }d}xJ| j D ]@}|dkrF|d| j| dd d  |d7 }q|| qW |t| jksftd|S )Nr   'z''r   r   )rL   appendrX   replacer,   r=   r.   )r   r6   r4   rR   r   r   r   code_with_strings   s     
z&stripped_source_line.code_with_stringsc             C   s<   |d kr| j d d fS |dk r,| j d |fS | j| j|  S )Nr   )rU   rV   rW   )r   r   r   r   r   r      s
    z"stripped_source_line.stmt_locationc             C   s   | j d jd kS )Nr   )rU   r   )r   r   r   r   
is_comment   s    zstripped_source_line.is_commentc          	   C   s   t |tr0|t| j\}}}|dks,t~n|}|d }g }g }g }xVt| j| j| j	D ]@\}}	}
|
|k rpq\|
|krzP |
| |
|	 |
|
|  q\W t| j| j| j| | j| |||dS )Nr   )rU   rV   rW   rL   rX   rY   rZ   )
isinstancesliceindicesr,   rL   r=   r   rX   rY   rZ   r\   stripped_source_line_slicerU   rV   rW   )r   keyrW   stopstepZslice_stringsZslice_strings_locsZslice_string_indicesr   locssir   r   r   __getitem__   s2    
  

z stripped_source_line.__getitem__c             C   s>   t | jd}|dk s"|t| jkr:| jdt| j dd d S )N)rL   r   zNot an identifier: %s)r   )r   rL   r,   r9   repr)r   r   r   r   r   raise_if_not_identifier   s    z,stripped_source_line.raise_if_not_identifierc             C   s   |    | jS )N)rk   rL   )r   r   r   r   extract_identifier   s    z'stripped_source_line.extract_identifierr   c             C   s2   t | j|d}|dk r.| jdtd|d d |S )N)rL   rW   r   zMissing a closing ")"r   )r0   r   )r   rL   r9   max)r   rW   r   r   r   r   index_of_closing_parenthesis   s    z1stripped_source_line.index_of_closing_parenthesisc             C   sX   | j }t|}|}x@||k rR|| }|dkr0|S |d7 }|dkr| j|dd }qW dS )N,r   ()rW   )rL   r,   rn   )r   rW   rL   nr   rR   r   r   r   
comma_scan   s    
zstripped_source_line.comma_scanN)r   )r   )r   r   r   r?   rS   r^   r   r_   ri   rk   rl   rn   rs   r   r   r   r   rT      s"   
rT   c             C   sj   t | }x\|dkrd|d8 }| | }d|}|dk r
|d t | krHd S d|dkr^|d S d S q
W d S )Nr   r   
0123456789z,(/$)r,   rN   )rL   r   rR   digitr   r   r   get_hollerith_count_index   s    

rv   c               @   s   e Zd ZejZdS )rc   N)r   r   r   rT   r?   r   r   r   r   rc     s   rc   c          	   C   sJ  g }g }g }g }g }|j }|j }t| }d}	x|	|k r,| |	 }
|
j}t|}d}x||k r || }|dkrz||
_P |dks|dkr|}| t| |d ||
|f |d7 }g }g }d}x|rx||k r.|| }|}|d7 }||kr|||sd}P |d7 }| | | |
|f qW |	d7 }	|	|krd|d d jd	| |d d d
 | |	 }
|
j}t|}d}qW | d| | | qXd|dk r| }|dkrt	|}nd }|d kr||  ||
|f |d7 }qt
d||d  }||d = ||d = | t| |d ||
|f |d7 }g }g }xt||k r| ||  | |
|f |d7 }t||krP n.|	d7 }	|	|krP | |	 }
|
j}t|}d}qZW t||kr|d d jd|d d d
 | d| | | qX|d7 }qXW |	d7 }	q0W t| |d|d|||dS )Nr   !r[   "r   TFrq   z Missing terminating %s character)r0   r   r   z 	hz)Missing characters for Hollerith constant)rU   rV   rL   rW   rX   rY   rZ   )r\   r,   rE   rG   
startswithr9   r.   rN   lowerrv   intrT   )rU   rL   rg   rX   rY   rZ   calan_sli_slr   r   rr   r   rR   opening_quotestring_charsstring_chars_locs	in_stringZcir4   Zhollerith_countr   r   r   strip_spaces_separate_strings  s    










r   c               @   s*   e Zd ZdddddgZdd Zdd	 Zd
S )fmt_string_strippedrL   rg   rX   rY   rZ   c                sZ   j }|j j}|j| }|j| }t|t|ks<tg }g | _g | _g | _g | _|j	}| jj	}t|}	d}
d}xp||	k r|| }|| }|dks|dkr|
s|  |}| j	t| |d || |d7 }g }g }d}x|r|x||	k rP|| }|| }|d7 }||kr:|
||s2d}P |d7 }|	| |	| qW | jd }|d jd||f |d d	 qW | j	d
| | j	| qzd|dk r|
r||  || n|dkr|  d}
|d7 }qzW  fdd} fdd}t|dkr$|
r|  |  n|d dkr8|  |  | j  d
|| _d S )NFr   r[   rx   r   Trq   z=Missing terminating %s within character format specifier "%s")r0   r   r   z 	rp   c                  s    j dd d S )Nz!Format string must start with "(")r0   )r9   r   )fmt_tokr   r   raise_must_start  s    z6fmt_string_stripped.__init__.<locals>.raise_must_startc                  s    j dd d S )NzFormat string must end with ")")r0   )r9   r   )r   r   r   raise_must_end  s    z4fmt_string_stripped.__init__.<locals>.raise_must_end))sslrZ   indexi_coderX   rY   r,   r=   rg   r\   rz   r9   r.   rN   r{   poprL   )r   r   r   r   
fmt_stringZfmt_string_locsrL   r}   r~   rr   Zhave_leading_parenthesisrR   locr   r   r   r   r   r   r   )r   r   rS   s  s    







zfmt_string_stripped.__init__c             C   s   |d krd}| j | S )Nr   )rg   )r   r   r   r   r   r     s     z!fmt_string_stripped.stmt_locationN)r   r   r   r?   rS   r   r   r   r   r   r   o  s   Jr   c       	      C   s   g }|j }t| }d}x||k r| | }|jd krL|t|gd |d7 }q|jrVt|g}|}x@t|d |D ].}| | }|jr| | |}qp|jd k	rpP qpW x4t|d |D ]"}| | }|js|t|gd qW |t|d |d }qW |S )Nr   )rU   r   )r\   r,   r   r   rF   r=   r   )	source_linesr6   rappr   r   r   Zcode_slsZk_slZj_slr   r   r   +combine_continuation_lines_and_strip_spaces  s4    





r   c             C   s   dd l m} g }x|D ]}|jdkrt|jdks6t|jd }||rP|}n"|jd d }||	|j
|}||s|jddd |t| |d q|| qW |S )	Nr   zinclude'r   rq   zMissing include file   )r0   r   )rP   rB   )Zos.pathpathrL   r,   rX   r=   isabsrV   r.   dirnamerB   isfiler<   extendloadr\   )rP   stripped_source_linesopr6   r   rB   	file_pathr   r   r   r   load_includes  s"    




r   Fc       	   	   C   sr   g }t |}|  }W d Q R X x.t|D ]"\}}|t| ||d |d q.W t|d}|rf|S t| |dS )Nr   )rP   rB   rC   r+   )r   )rP   r   )openreadr/   	enumerater\   r@   r   r   )	rP   rB   skip_load_includesr   flinesZi_liner'   r   r   r   r   r     s     
r   c             C   s8   g }|d krt | j}t|tj| ||d||d d |S )N)r   rW   re   )tokens	tokenizerallow_commasallow_equal_signstok_opening_parenthesis)r,   rL   tokenize_expression_implr
   ssl_iterator)r   rW   re   r   r   r6   r   r   r   tokenize_expression  s     
r   c             C   s6  ddl m}m} |r2g }| ||j|j|d n| }|j}x|D ]}	|	 r|	j}
|
dkrg }t||d||	d |||	j|	j	|d qB|
dkr|d kr|	
  d S |
dkr|s|	jj|	j	d	 g }| ||j|j|d |j}qB|
d
kr|s|	jj|	j	d	 ||	 qB||	 qBqBW |d k	r2|  d S )Nr   )tk_seqtk_parentheses)r   r   valuerp   T)r   r   r   r   r   r   ro   )r   =)Zfable.tokenizationr   r   r\   r   r   is_opr   r   r   Zraise_missing_openingr:   Zraise_missing_closing)r   r   r   r   r   r   r   ZtlistZtapptoktvnested_tokensr   r   r   r     sR    



r   c             C   s:   g }x0t | D ]$\}}| r|jdkr|| qW |S )Nr   )r   r   r   r\   )r   r6   r   r   r   r   r    indices_of_tokenized_equal_signsG  s
    r   c               @   s   e Zd ZdS )vt_usedN)r   r   r   r   r   r   r   r   O  s    r   c               @   s   e Zd ZdS )	vt_scalarN)r   r   r   r   r   r   r   r   P  s    r   c               @   s   e Zd ZdS )	vt_stringN)r   r   r   r   r   r   r   r   Q  s    r   c               @   s   e Zd ZdS )vt_arrayN)r   r   r   r   r   r   r   r   R  s    r   c               @   s   e Zd ZdS )vt_intrinsicN)r   r   r   r   r   r   r   r   S  s    r   c               @   s   e Zd ZdS )vt_externalN)r   r   r   r   r   r   r   r   T  s    r   c               @   s   e Zd ZdS )vt_functionN)r   r   r   r   r   r   r   r   U  s    r   c               @   s   e Zd ZdS )vt_subroutineN)r   r   r   r   r   r   r   r   V  s    r   c               @   s   e Zd ZdS )vs_fproc_nameN)r   r   r   r   r   r   r   r   Y  s    r   c               @   s   e Zd ZdS )vs_argumentN)r   r   r   r   r   r   r   r   Z  s    r   c               @   s   e Zd ZdS )	vs_commonN)r   r   r   r   r   r   r   r   [  s    r   c               @   s   e Zd ZdS )vs_saveN)r   r   r   r   r   r   r   r   \  s    r   c               @   s   e Zd ZdS )vs_localN)r   r   r   r   r   r   r   r   ]  s    r   c               @   s   e Zd ZdS )vs_parameterN)r   r   r   r   r   r   r   r   ^  s    r   c               @   s   e Zd Zddddddddd	d
ddgZd0ddZdd Zdd Zdd Zdd Zdd Z	dd Z
dd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ ZdS )1
fdecl_infoid_tokvar_typevar_storage	data_typesize_tokens
dim_tokensparameter_assignment_tokensf90_declis_modified	use_countpassed_as_argpassed_as_arg_plainNc             C   sx   |d kst |tst|d ks,t |ts,t|| _|| _|| _|| _|| _|| _d | _	|| _
d| _d| _i | _i | _d S )NFr   )r`   listr=   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   rS   p  s    zfdecl_info.__init__c             C   s
   | j tkS )N)r   r   )r   r   r   r   is_used      zfdecl_info.is_usedc             C   s
   | j tkS )N)r   r   )r   r   r   r   	is_scalar  r   zfdecl_info.is_scalarc             C   s
   | j tkS )N)r   r   )r   r   r   r   	is_string  r   zfdecl_info.is_stringc             C   s
   | j tkS )N)r   r   )r   r   r   r   is_array  r   zfdecl_info.is_arrayc             C   s
   | j tkS )N)r   r   )r   r   r   r   is_intrinsic  r   zfdecl_info.is_intrinsicc             C   s
   | j tkS )N)r   r   )r   r   r   r   is_external  r   zfdecl_info.is_externalc             C   s
   | j tkS )N)r   r   )r   r   r   r   is_function  r   zfdecl_info.is_functionc             C   s
   | j tkS )N)r   r   )r   r   r   r   is_subroutine  r   zfdecl_info.is_subroutinec             C   s   | j }|tkp|tkp|tkS )N)r   r   r   r   )r   vtr   r   r   is_user_defined_callable  s    z#fdecl_info.is_user_defined_callablec             C   s
   | j tkS )N)r   r   )r   r   r   r   is_fproc_name  r   zfdecl_info.is_fproc_namec             C   s
   | j tkS )N)r   r   )r   r   r   r   is_argument  r   zfdecl_info.is_argumentc             C   s
   | j tkS )N)r   r   )r   r   r   r   	is_common  r   zfdecl_info.is_commonc             C   s
   | j tkS )N)r   r   )r   r   r   r   is_save  r   zfdecl_info.is_savec             C   s
   | j tkS )N)r   r   )r   r   r   r   is_local  r   zfdecl_info.is_localc             C   s
   | j tkS )N)r   r   )r   r   r   r   is_parameter  r   zfdecl_info.is_parameterc             C   s   | j }|d kr| j  |S )N)r   r   r>   )r   r6   r   r   r   $required_parameter_assignment_tokens  s    
z/fdecl_info.required_parameter_assignment_tokens)N)r   r   r   r?   rS   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   `  s:   	
r   c             C   s~   | j }|| }|dkr@| j|d d}|d t| |d |dfS t||d}|dk r`| j|d |tj| |||| dgfS )	Nrp   r   )rW   )r   rW   re   )rL   rW   r   )r   )r   r   r   )rL   rn   r   r   r:   r
   
tk_integer)r   rW   rL   rR   i_clpZi_sizer   r   r   extract_size_tokens  s    
r   zJbyte
character
complex
doublecomplex
doubleprecision
integer
logical
real
c             C   sL   | j j}x2tD ]*}|||r|t| tj| ||dfS qW |sH|   dS )N)r   r   r   )NN)rL   rz   
data_typesr,   r
   tk_identifierr:   )r   rW   optionalswr   r   r   r   extract_data_type  s    


r   c             C   sX   t | ||d\}}|r"|d kr"dS | jd|s:||d fS t| |d d\}}|||fS )N)r   rW   r   )NNN*r   )r   rW   )r   rL   rz   r   )r   rW   r   r   r   r   r   r   r   extract_data_type_and_size  s    
r   c             C   s   | j }|t|kr| j|d |d|}|dkrF|d | || fS |d|rz| j|d d}|d | |d | fS |d fS )N)r   z::r      rp   r   )rW   )rL   r,   r:   rN   rz   rn   )r   rW   rL   Zi_ccr   r   r   r   extract_f90_decl  s    r   c                sZ   j t fdd}j d|r>|d7 }x|k rT||d}q@W d S )Nc                s"  d }d }t | d}|dk r(j| d |}x|kr8P | }|dkrR|d7 }P |dkr|d k	rnj|d j|d d}t|d |dd	}|d }q.|d
kr҈ r|d k	rj|d t|d d\}}q.j|d q.W |d kr}ttj| | | dd d ||d |S )N)rL   rW   r   )r   ro   r   rp   )rW   T)r   rW   re   r   r   )r   rW   )r   r   r   )r   r   r   r   r   r   r   )	r   r:   rn   r   r   r\   r   r
   r   )rW   Zitem_size_tokensr   Zi_idr   rR   r   )
allow_sizerL   r   r   r6   r   r   re   r   r   
parse_decl  sP    

z!extract_fdecl.<locals>.parse_declro   r   )rW   )rL   r,   rz   )r6   r   rW   r   r   r   r   r   r   )r   rL   r   r   r6   r   r   re   r   extract_fdecl  s    *
r   c             C   sF   t j}x:| D ]2}||drdS x|jD ]}|jddr&dS q&W qW dS )N)tok_seqF:)r   T)r
   tok_seq_is_starr   
is_op_with)r   Zis_starr   r   r   r   r   dimensions_are_simple  s    

r   c       	      C   s   ||kr| j |d g }| j}|}x|d k	rDt||krD| j |d t|||d}|dk rf| j |d |tj| |||| d ||krP || dkr| j |d |d }q$W t||k r| j |d |S )N)r   )rL   rW   re   r   )r   r   r   ro   r   )r:   rL   r,   r   r\   r
   r   )	r   rW   re   len_minlen_maxr6   rL   r   r4   r   r   r   process_labels_list  s*    r   c               @   s0   e Zd Zg Zdd Zdd Zdd Zdd Zd	S )
executable_infoc             K   sL   | j jdd  | _|d | _|d | _x | D ]\}}t| || q0W d S )Nr#   r   rW   )	__class__r   rd   r   rW   itemssetattr)r   kskvr   r   r   rS   :  s
    

zexecutable_info.__init__c             C   s   t j||dd d S )NT)callbackr   Zwith_next_token)r
   search_for_id_tokens)r   r  r   r   r   r   s4itA  s    zexecutable_info.s4itc             C   s2   x,|j D ]"}t||}|d k	r| || qW d S )N)r?   getattrr  )r   r  Zobj_with_slotsr   attrr   r   r   
s4it_slotsE  s    
zexecutable_info.s4it_slotsc             C   s   d S )Nr   )r   fdecl_by_identifierr   r   r   set_is_modifiedK  s    zexecutable_info.set_is_modifiedN)r   r   r   r?   rS   r  r  r	  r   r   r   r   r   6  s
   r   c              G   s   d|  S )N)rd   r   rW   r   )namesr   r   r   mkslN  r   r  c               @   s   e Zd Ze Zdd ZdS )ei_allocatec             C   s   d S )Nr   )r   r  r   r   r   r  S  s    z ei_allocate.search_for_id_tokensN)r   r   r   r  r?   r  r   r   r   r   r  P  s   r  c               @   s   e Zd Ze Zdd ZdS )	ei_assignc             C   s   d S )Nr   )r   r  r   r   r   r  Y  s    zei_assign.search_for_id_tokensN)r   r   r   r  r?   r  r   r   r   r   r  V  s   r  c               @   s&   e Zd ZeddZdd Zdd ZdS )ei_assignment
lhs_tokens
rhs_tokensc             C   s    |  || j |  || j d S )N)r  r  r  )r   r  r   r   r   r  _  s    z"ei_assignment.search_for_id_tokensc             C   sN   t | jdkst| jd }| s,|  ||j}|d k	sDtd|_d S )Nr   T)r,   r  r=   is_identifierr:   getr   r   )r   r  r   tfr   r   r   r	  c  s    
zei_assignment.set_is_modifiedN)r   r   r   r  r?   r  r	  r   r   r   r   r  \  s   
r  c               @   s   e Zd ZeddZdd ZdS )ei_file_positioningio_functionalistc             C   s   | j d k	r| || j  d S )N)r  r  )r   r  r   r   r   r  o  s    
z(ei_file_positioning.search_for_id_tokensN)r   r   r   r  r?   r  r   r   r   r   r  l  s   
r  c               @   s   e Zd ZeddZdd ZdS )ei_callsubroutine_name	arg_tokenc             C   s,   || j | j | jd k	r(| || jj d S )N)r  r  r  r   )r   r  r   r   r   r  v  s    
zei_call.search_for_id_tokensN)r   r   r   r  r?   r  r   r   r   r   r  s  s   
r  c               @   s   e Zd ZedZdd ZdS )ei_closecllistc             C   s   |  || j d S )N)r  r  )r   r  r   r   r   r  ~  s    zei_close.search_for_id_tokensN)r   r   r   r  r?   r  r   r   r   r   r  {  s   r  c               @   s   e Zd Ze Zdd ZdS )ei_continuec             C   s   d S )Nr   )r   r  r   r   r   r    s    z ei_continue.search_for_id_tokensN)r   r   r   r  r?   r  r   r   r   r   r    s   r  c               @   s   e Zd Ze Zdd ZdS )ei_cyclec             C   s   d S )Nr   )r   r  r   r   r   r    s    zei_cycle.search_for_id_tokensN)r   r   r   r  r?   r  r   r   r   r   r    s   r  c               @   s   e Zd Ze Zdd ZdS )ei_deallocatec             C   s   d S )Nr   )r   r  r   r   r   r    s    z"ei_deallocate.search_for_id_tokensN)r   r   r   r  r?   r  r   r   r   r   r    s   r  c               @   s(   e Zd ZedddZdd Zdd ZdS )	ei_dorD   r   r   c             C   s   || j d  | || j d S )N)r   r  r   )r   r  r   r   r   r    s    zei_do.search_for_id_tokensc             C   s   || j j }d|_d S )NT)r   r   r   )r   r  fdeclr   r   r   r	    s    zei_do.set_is_modifiedN)r   r   r   r  r?   r  r	  r   r   r   r   r    s   r  c               @   s   e Zd ZeddZdd ZdS )
ei_dowhilerD   cond_tokensc             C   s   |  || j d S )N)r  r"  )r   r  r   r   r   r    s    zei_dowhile.search_for_id_tokensN)r   r   r   r  r?   r  r   r   r   r   r!    s   
r!  c               @   s   e Zd Ze Zdd ZdS )ei_elsec             C   s   d S )Nr   )r   r  r   r   r   r    s    zei_else.search_for_id_tokensN)r   r   r   r  r?   r  r   r   r   r   r#    s   r#  c               @   s   e Zd ZedZdd ZdS )ei_elseif_thenr"  c             C   s   |  || j d S )N)r  r"  )r   r  r   r   r   r    s    z#ei_elseif_then.search_for_id_tokensN)r   r   r   r  r?   r  r   r   r   r   r$    s   r$  c               @   s   e Zd Ze Zdd ZdS )ei_enddoc             C   s   d S )Nr   )r   r  r   r   r   r    s    zei_enddo.search_for_id_tokensN)r   r   r   r  r?   r  r   r   r   r   r%    s   r%  c               @   s   e Zd Ze Zdd ZdS )ei_endifc             C   s   d S )Nr   )r   r  r   r   r   r    s    zei_endif.search_for_id_tokensN)r   r   r   r  r?   r  r   r   r   r   r&    s   r&  c               @   s   e Zd Ze Zdd ZdS )ei_entryc             C   s   d S )Nr   )r   r  r   r   r   r    s    zei_entry.search_for_id_tokensN)r   r   r   r  r?   r  r   r   r   r   r'    s   r'  c               @   s   e Zd Ze Zdd ZdS )ei_exitc             C   s   d S )Nr   )r   r  r   r   r   r    s    zei_exit.search_for_id_tokensN)r   r   r   r  r?   r  r   r   r   r   r(    s   r(  c               @   s   e Zd ZedZdd ZdS )ei_gotorD   c             C   s   d S )Nr   )r   r  r   r   r   r    s    zei_goto.search_for_id_tokensN)r   r   r   r  r?   r  r   r   r   r   r)    s   r)  c               @   s   e Zd ZeddZdd ZdS )ei_goto_computedlabelsr   c             C   s   |  || j d S )N)r  r   )r   r  r   r   r   r    s    z%ei_goto_computed.search_for_id_tokensN)r   r   r   r  r?   r  r   r   r   r   r*    s   
r*  c               @   s   e Zd ZedZdd ZdS )ei_ifr"  c             C   s   |  || j d S )N)r  r"  )r   r  r   r   r   r    s    zei_if.search_for_id_tokensN)r   r   r   r  r?   r  r   r   r   r   r,    s   r,  c               @   s   e Zd ZedZdd ZdS )
ei_if_thenr"  c             C   s   |  || j d S )N)r  r"  )r   r  r   r   r   r    s    zei_if_then.search_for_id_tokensN)r   r   r   r  r?   r  r   r   r   r   r-    s   r-  c               @   s   e Zd ZeddZdd ZdS )ei_if_arithmeticr"  r+  c             C   s   |  || j d S )N)r  r"  )r   r  r   r   r   r    s    z%ei_if_arithmetic.search_for_id_tokensN)r   r   r   r  r?   r  r   r   r   r   r.    s   
r.  c               @   s   e Zd ZedZdd ZdS )
ei_inquireiuflistc             C   s   |  || j d S )N)r  r0  )r   r  r   r   r   r    s    zei_inquire.search_for_id_tokensN)r   r   r   r  r?   r  r   r   r   r   r/    s   r/  c               @   s   e Zd ZedZdd ZdS )ei_openolistc             C   s   |  || j d S )N)r  r2  )r   r  r   r   r   r    s    zei_open.search_for_id_tokensN)r   r   r   r  r?   r  r   r   r   r   r1    s   r1  c               @   s    e Zd ZedddZdd ZdS )ei_printcilistiolist
fmt_tokensc             C   s    |  || j | || j d S )N)r  r4  r  r5  )r   r  r   r   r   r    s    zei_print.search_for_id_tokensN)r   r   r   r  r?   r  r   r   r   r   r3    s   r3  c               @   s(   e Zd ZedddZdd Zdd ZdS )	ei_readr4  r5  r6  c             C   s4   | j d k	r| || j  | jd k	r0| || j d S )N)r4  r  r5  r  )r   r  r   r   r   r    s    

zei_read.search_for_id_tokensc                s*   | j d k	r& fdd}tj|| j d d S )Nc                s    | j  }d|_d S )NT)r   r   )r   r   )r  r   r   r    s    
z)ei_read.set_is_modified.<locals>.callback)r  r   )r5  r
   %search_for_data_or_read_target_tokens)r   r  r  r   )r  r   r	    s    
zei_read.set_is_modifiedN)r   r   r   r  r?   r  r	  r   r   r   r   r7    s   r7  c               @   s   e Zd ZedZdd ZdS )	ei_returnreturn_labelc             C   s   d S )Nr   )r   r  r   r   r   r    s    zei_return.search_for_id_tokensN)r   r   r   r  r?   r  r   r   r   r   r9  
  s   r9  c               @   s   e Zd ZedZdd ZdS )ei_stopr  c             C   s   d S )Nr   )r   r  r   r   r   r    s    zei_stop.search_for_id_tokensN)r   r   r   r  r?   r  r   r   r   r   r;    s   r;  c               @   s(   e Zd ZedddZdd Zdd ZdS )	ei_writer4  r5  r6  c             C   s    |  || j | || j d S )N)r  r4  r  r5  )r   r  r   r   r   r    s    zei_write.search_for_id_tokensc             C   sd   | j d k	r`| j jd k	r`t| j jdkr`| j jd }| r`||j }|jd k	r`|jjdkr`d|_d S )Nr   	characterT)r4  unitr,   r  r   r   r   )r   r  Z	first_tokr   r   r   r   r	    s    


zei_write.set_is_modifiedN)r   r   r   r  r?   r  r	  r   r   r   r   r<    s   r<  c               @   sV  e Zd ZdZg Zdd Zdd Zdd Zdd	 Zd
d Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd ZdSddZdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Z d;d< Z!d=d> Z"d?d@ Z#dAdB Z$dCdD Z%dEdF Z&dGdH Z'dIdJ Z(dKdL Z)dMdN Z*dOdP Z+dQdR Z,dS )Tfproc_p_methodszFSeparated from class fproc for clarity and a minor getattr speed gain.c             C   s   | j t||d d S )N)r   rW   )
executabler\   r  )r   r   rW   r   r   r   
p_allocate/  s    zfproc_p_methods.p_allocatec             C   s   | j t||d d S )N)r   rW   )r@  r\   r  )r   r   rW   r   r   r   p_assign2  s    zfproc_p_methods.p_assignc             C   s   t |}|jd|| rRtj||| d}t|d d}|jd krj|jd|d ntd t||| dd}| j	
t||||d d S )Nrp   )r   rW   )tzr>  z(Required UNIT information is not defined)r0   r   )r   rW   r  r  )r,   rL   rz   r
   r   collect_io_alistr>  r<   r   r@  r\   r  )r   r   rW   r  ZliofrC  r  r   r   r   p_file_positioning5  s    
z"fproc_p_methods.p_file_positioningc             C   s   | j ||dd d S )N	backspace)r   rW   r  )rE  )r   r   rW   r   r   r   p_backspaceD  s    zfproc_p_methods.p_backspacec             C   s   t ||d d}t|dks4t|dks4|d  s<|  |d }t|dkrVd }n|d  sj|  |d }| jt||||d d S )N   )r   rW   r   r   r   )r   rW   r  r  )r   r,   r  r:   is_parenthesesr@  r\   r  )r   r   rW   r   r  r  r   r   r   p_callG  s    zfproc_p_methods.p_callc             C   sX   t j||d d}t|d}|jdd}|d k	r8|  | jt|||d d| _d S )NrK   )r   rW   )rC  T)r   )r   rW   r  )	r
   r   collect_io_cllist
look_aheadr:   r@  r\   r  uses_io)r   r   rW   rC  r  r   r   r   r   p_closeX  s    
zfproc_p_methods.p_closec             C   s   |dkst |j}t|dkr&|  |d }|dkr~|dd}|dk rR|  |dkrdd}d}q|d|  }|d }nd}d}t| jj	|d||d d d	d
 d S )Nr   rI   /r   Zcommonymous   r   )rd   F)r6   r   rW   r   r   r   )
r=   rL   r,   r:   rN   r;   rl   r   commonr  )r   r   rW   rL   rR   r   common_namer   r   r   r   p_commona  s.    
zfproc_p_methods.p_commonc             C   s   | j t||d d S )N)r   rW   )r@  r\   r  )r   r   rW   r   r   r   
p_continue|  s    zfproc_p_methods.p_continuec             C   s:   t |j|d kr"|j|d d | jt||d d S )NrK   )r   )r   rW   )r,   rL   r:   r@  r\   r  )r   r   rW   r   r   r   p_cycle  s    zfproc_p_methods.p_cyclec             C   s  |dkst tj|dd}d }xg }x|d kr8| }| r|g}|tj|j|j|d | }|j	ddr|j
|j|d | }|j	ddr|j
|j|d | }nN|j	ddrg }|tj|j|j|d ||j|d | }n|  |j	d	dsP d }q(W |j	d
ds.|  g }d }d}	g }
xx| }t|
dkr|d kr| sv| r| j	ddr|}|  | }| r|jdkr|	dkst|
dkr|  d}	|
| n|jdkrt|
|	kr|  |
|j|d nz|jd
krLt|
|	kr:|  |||
f P nF|jd	krt|
|	krn|  |||
f d }d}	g }
n|  n t|
|	kr|  |
| qBW | j||f |jdd}|d krP |j	d	dr"d }q"W d S )Nr   rH  )r   rW   )r   r   r   rp   )r   )r  opening_token)rV  ro   rO  r   )+r"   r   T)r   )r=   r
   r   r  r  r\   r   r   r   r   collect_to_matching_parenthesisZget_implied_dor:   r,   
is_integerrL  r   r   Zget_complex_literaldata)r   r   rW   rC  r   nlistZntoksclistZrepetition_tokZ
sign_countZctoksr   r   r   p_data  s    





zfproc_p_methods.p_datac             C   s   | j t||d d S )N)r   rW   )r@  r\   r  )r   r   rW   r   r   r   p_deallocate  s    zfproc_p_methods.p_deallocatec             C   s&   |dkst t| j|dd d dd d S )Nr   	   F)r6   r   rW   r   r   r   )r=   r   	dimension)r   r   rW   r   r   r   p_dimension  s    zfproc_p_methods.p_dimensionc             C   s   |dkst |j}t|dd}|dk r0d}d }n |d| }|| dkrP|d7 }t||d}|dksht || dksxt t||d dd	}dt|  krdksn |j|d d
 | jt	|||t
j||||| d|d d S )Nr   r   )rL   rW   r#   ro   r   r   T)r   rW   r   )r   )r   r   r   )r   rW   rD   r   r   )r=   rL   r   r   r   r,   r:   r@  r\   r  r
   r   )r   r   rW   rL   r   rD   r4   r   r   r   r   p_do  s&    zfproc_p_methods.p_doNc             C   st   |dkst |d krd}d }n|d }|jd| }t||d}t|dkrX|j|d | jt||||d d S )	Nr   r   rK   r   )r   rW   r   )r   )r   rW   rD   r"  )r=   rL   r   r,   r:   r@  r\   r!  )r   r   rW   	label_endr   rD   r"  r   r   r   	p_dowhile  s    zfproc_p_methods.p_dowhilec             C   s$   |dkst | jt||d d S )Nr   )r   rW   )r=   r@  r\   r#  )r   r   rW   r   r   r   p_else	  s    zfproc_p_methods.p_elsec             C   s    |dkst | j|ddd d S )Nr   Zelseif)r   keywordrW   )r=   p_if_elseif)r   r   rW   r   r   r   p_elseif  s    zfproc_p_methods.p_elseifc             C   s$   |dkst | jt||d d S )Nr   )r   rW   )r=   r@  r\   r%  )r   r   rW   r   r   r   p_enddo  s    zfproc_p_methods.p_enddoc             C   s   | j ||dd d S )Nendfile)r   rW   r  )rE  )r   r   rW   r   r   r   	p_endfile  s    zfproc_p_methods.p_endfilec             C   s$   |dkst | jt||d d S )Nr   )r   rW   )r=   r@  r\   r&  )r   r   rW   r   r   r   p_endif  s    zfproc_p_methods.p_endifc             C   s$   |dkst | jt||d d S )Nr   )r   rW   )r=   r@  r\   r'  )r   r   rW   r   r   r   p_entry  s    zfproc_p_methods.p_entryc                s   |dkst g }tj|dd}xd| }|jdds<|   fdd}|j||d |jd	d
}|d krlP |jdds |  q W d S )Nr      )r   rW   rp   )r   c                sf   t | jdkr|   x>| jD ]4}t |jdkr8|   |jd }| s|  qW  j|  d S )Nr   )r,   r   r:   r  r   r\   )r   r   r   )r   r   r   r  (  s    
z/fproc_p_methods.p_equivalence.<locals>.callback)r  rV  T)r   ro   )r=   r
   r   r  r   r:   rX  )r   r   rW   bufferrC  r   r  r   )r   r   p_equivalence   s     
zfproc_p_methods.p_equivalencec             C   s:   t |j|d kr"|j|d d | jt||d d S )NrH  )r   )r   rW   )r,   rL   r:   r@  r\   r(  )r   r   rW   r   r   r   p_exit;  s    zfproc_p_methods.p_exitc             C   s,   |dkst tj|ddj| jjdd d S )Nr   rP  )r   rW   T)r  one_required)r=   r
   r   #collect_comma_separated_identifiersexternalr\   )r   r   rW   r   r   r   
p_external@  s    
zfproc_p_methods.p_externalc             C   s   |dkst |j}|ds t |ds.t |jd krF|jddd |j| jkr`|jddd ttj	|dd d	| j|j< d S )
Nr   zformat(r   z/FORMAT without a statement label in columns 1-5)r0   r   z(Duplicate statement label in columns 1-5rq   r   )fss)
r=   rL   rz   endswithrD   r9   formatr   r
   fss_iterator)r   r   rW   rL   r   r   r   p_formatF  s    


zfproc_p_methods.p_formatc       	      C   s  |j }|d }|t|kr&|j|d t||d}|t|krl| jt||tj||||d  dd d S |dkr|j|d || dkr,|j	|d d	}t
||d |dd d
}|d7 }|t|kr|j|d || dkr|d7 }|t|kr|j|d t||d}| jt||||d d S |d dkrB|  |d}|dk r^|  |d }|| dkr||d8 }t||d |d d}t
||d t|d dd d
}| jt||||d d S )NrH  )r   )rL   rW   )r   r   r   )r   rW   rD   r   rp   r   )rW   )r   rW   re   r   r   ro   )r   rW   )r   rW   r+  r   rq   r   )r   rW   re   )rL   r,   r:   r   r@  r\   r)  r
   r   rn   r   r   r*  rfind)	r   r   rW   rL   r   r4   r+  r   r   r   r   r   p_gotoS  sR    


zfproc_p_methods.p_gotoc             C   s*   | j |d|d}|d k	r&| j||d d S )Nif)r   rf  rW   )r   rW   )rg  process_body_line)r   r   rW   r   r   r   r   p_if  s    zfproc_p_methods.p_ifc             C   sN  |t | d }|j|d}t|||d}t |dkrB|j|d |j}|d|d rt ||d kr|dkrx|  |dkrt}nt}| j	||||d	 d S |dkr|  |d }	|	t |kr|j|	d t
||	|	d d
}
|
dk r|dkr|  | j	t|||d	 |	S t||	t |ddd}| j	t||||d d S )Nr   )rW   )r   rW   re   r   )r   ZthenrK   r}  )r   rW   r"  )rL   rW   re   r#   )r   rW   re   r   r   )r   rW   r"  r+  )r,   rn   r   r:   rL   rz   r-  r$  r@  r\   r   r,  r   r.  )r   r   rf  rW   Zi_openr   r"  rL   eir   r4   r+  r   r   r   rg    s>      


zfproc_p_methods.p_if_elseifc       
         s  |dkst jdkr i | _d S tdd\}}jd|rJjdsR  d  fdd	}xj|d
 d dD ]}t|dkr|d
 dkr||d }||d }xL ||d
  D ]}	|| j|	< qW q~x&|D ]}	|	dkr  || j|	< qW q~W d S )Nr   ZimplicitnonerP  )r   rW   rp   r   abcdefghijklmnopqrstuvwxyzc                s     | }|dk r  |S )Nr   )rN   r;   )rR   r   )lettersr   r   r   r    s    
z'fproc_p_methods.p_implicit.<locals>.getr   rq   ro   r#   r"   r   )	r=   rL   implicitr   rz   rw  r;   splitr,   )
r   r   rW   r   r   r  partr   r4   rR   r   )r  r   r   
p_implicit  s(    

zfproc_p_methods.p_implicitc             C   sX   t j||d d}t|d}|jdd}|d k	r8|  | jt|||d d| _d S )Nr   )r   rW   )rC  T)r   )r   rW   r0  )	r
   r   collect_io_iuflistrL  r:   r@  r\   r/  rM  )r   r   rW   rC  r0  r   r   r   r   	p_inquire  s    
zfproc_p_methods.p_inquirec             C   s,   |dkst tj|ddj| jjdd d S )Nr   r_  )r   rW   T)r  rr  )r=   r
   r   rs  	intrinsicr\   )r   r   rW   r   r   r   p_intrinsic  s    
zfproc_p_methods.p_intrinsicc             C   sX   t j||d d}t|d}|jdd}|d k	r8|  | jt|||d d| _d S )NrH  )r   rW   )rC  T)r   )r   rW   r2  )	r
   r   collect_io_olistrL  r:   r@  r\   r1  rM  )r   r   rW   rC  r2  r   r   r   r   p_open  s    
zfproc_p_methods.p_openc             C   s   |dkst |j}|ddr(|ds0|  t|dt|d ddd}xl|D ]d}t|jd	}t|dksx|d dkr|  |jd }|	 s|  | j
||jd
d  f qPW d S )Nr   rp   r_  r   
   r   T)r   rW   re   r   r   )r   r   )r=   rL   rz   rw  r:   r   r,   r   r   r  	parameterr\   )r   r   rW   rL   Z	tokens_llZtokens_lZi_equal_signsZ	key_tokenr   r   r   p_parameter  s&    



zfproc_p_methods.p_parameterc          	   C   s   t j||d d}g }|j|jddd t|dks8ttd |d jd}d }t|jdkr|jd 	 rt
t jt|jd dd	}t|d
}| jt|||||d d| _d| _d S )NrK   )r   rW   Fr   )r  Zfirst_get_optionalZ!stop_after_given_number_of_commasr   )rC  fmt)r   )rv  )rC  )r   rW   r4  r6  r5  T)r
   r   #collect_comma_separated_expressionsr\   r,   r=   collect_io_cilistr   r  r   r   ry  r   collect_iolistr@  r3  rM  
uses_write)r   r   rW   rC  Z
fmt_bufferr4  r6  r5  r   r   r   p_print  s"    
zfproc_p_methods.p_printc          	   C   s   t j||d}t|d}|jd kr0|jd|d d }|jd k	rvt|jdkrv|jd  rvtt j	t
|jd dd}|tkr|jd k	r|jd jd	d
 t|d}| j||||||d d S )N)r   rW   )rC  z(Required UNIT information is not defined)r0   r   r   r   )r   )rv  z#END is invalid for WRITE statements)r0   )r   rW   r4  r6  r5  )r
   r   r  r>  r<   r  r,   r   r   ry  r   r<  endr  r@  r\   )r   r   rW   ei_typerC  r4  r6  r5  r   r   r   p_read_write   s     





zfproc_p_methods.p_read_writec          	   C   s   |j }|d|d r|d|d rvtj||d d}g }|j|jdd tj|d	}t|d
kr|j|d d n&t||d krd }n|j|d d | j	t
||d d |d n6|d|d r| j||d t
d n|j|d d d| _d| _d S )Nr   rH  ro   rK   rI   )r   rW   r   )r  enable_implied_do)r   r   )r   )r   rW   r4  r6  r5  rp   )r   rW   r  T)rL   rz   r
   r   r  r\   remove_redundant_parenthesesr,   r:   r@  r7  r  rM  	uses_read)r   r   rW   rL   rC  r5  r   r   r   p_read  s*    zfproc_p_methods.p_readc             C   s"   | j t||||d  d d S )N)r   rW   r:  )r@  r\   r9  )r   r   rW   r   r   r   p_return+  s    zfproc_p_methods.p_returnc             C   s   | j ||dd d S )Nrewind)r   rW   r  )rE  )r   r   rW   r   r   r   p_rewind/  s    zfproc_p_methods.p_rewindc             C   s@   |dkst | jd k	r<tj|ddj| jjdddkr<d | _d S )Nr   rH  )r   rW   T)r  Zenable_common)r=   saver
   r   rs  r\   )r   r   rW   r   r   r   p_save2  s    

zfproc_p_methods.p_savec             C   st   t j||d d}|jdd}|d k	rZ| s>| s>|  |jdd}|d k	rZ|  | jt|||d d S )NrH  )r   rW   T)r   )r   rW   r  )	r
   r   r  rY  r   r:   r@  r\   r;  )r   r   rW   rC  r   next_tokr   r   r   p_stop:  s    zfproc_p_methods.p_stopc             C   s$   | j ||d td d| _d| _d S )NrK   )r   rW   r  T)r  r<  rM  r  )r   r   rW   r   r   r   p_writeE  s    zfproc_p_methods.p_write)N)-r   r   r   __doc__r?   rA  rB  rE  rG  rJ  rN  rS  rT  rU  r]  r^  ra  rb  rd  re  rh  ri  rk  rl  rm  rp  rq  ru  rz  r|  r  rg  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r?  *  sT   	S

- 		r?  c       	      C   s  x| j D ]}t| |d  qW | }| s4|  |jdkrf| }|jddsZ|  |g| _n@|jdkrx|  x*| }|jddrP g }| }|jddr|  |	 s|  |j}|| j kr|  n:|
| x.| j d | D ]}t| |d krP qW |  x~| }|jddr0P |  |jddrHP |jddrg }|j|j
|d |
tj|j|j|d n
|
| qW t| || q|W d S )	Nr   ro   )r   rp   r   r   )r  rV  )r   r   r   )r?   r   r  r   r:   r   r   r  rL  r  r\   r  r  r
   r   r   r   )	r   rC  	n_impliedknownr   Zvalue_tokensr  rd   r   r   r   r   collect_keyword_argumentsJ  s\    




r  c               @   s*   e Zd ZdZddddddgZdd	d
ZdS )r  z%Control Information List f77_std 12.8r>  r  reciostaterrr  Nc             C   s>   |d krt | |dd n"x| jD ]}t| |d  q W || _d S )Nr   )r   rC  r  )r  r?   r   r  )r   rC  r  r  r   r   r   rS     s
    zcollect_io_cilist.__init__)N)r   r   r   r  r?   rS   r   r   r   r   r  ~  s   r  c               @   s6   e Zd ZdZddddddgZdd	d
ge Zdd ZdS )r  zOpen List f77_std 12.10.1accessformreclblankstatusr  r>  filer  c             C   s   t | |dd d S )Nr   )r   rC  r  )r  )r   rC  r   r   r   rS     s    zcollect_io_olist.__init__N)r   r   r   r  chainr?   rS   r   r   r   r   r    s   r  c               @   s,   e Zd ZdZddgZddge Zdd ZdS )	rK  zClose List f77_std 12.10.2r  r  r>  r  c             C   s   t | |dd d S )Nr   )r   rC  r  )r  )r   rC  r   r   r   rS     s    zcollect_io_cllist.__init__N)r   r   r   r  r  r?   rS   r   r   r   r   rK    s   rK  c               @   sH   e Zd ZdZdddddddd	d
ddddddgZdddge Zdd ZdS )r  z iulist or iflist f77_std 12.10.3r  existZopenednumbernamednamer  Z
sequentialZdirectr  	formattedZunformattedr  Znextrecr  r>  r  r  c             C   s   t | |dd d S )Nr   )r   rC  r  )r  )r   rC  r   r   r   rS     s    zcollect_io_iuflist.__init__N)r   r   r   r  r  r?   rS   r   r   r   r   r    s   r  c               @   s*   e Zd ZdZdgZddge Zdd ZdS )rD  zf77_std 12.10.4r  r>  r  c             C   s:   |d k	r$|d kst t| |dd n|| _d | _d | _d S )Nr   )r   rC  r  )r=   r  r>  r  r  )r   rC  r>  r   r   r   rS     s    zcollect_io_alist.__init__N)r   r   r   r  r  r?   rS   r   r   r   r   rD    s   rD  c             C   sL   g }| j dd}|d k	rH|jddr,|   | j|jdd tj|d}|S )NT)r   ro   )r   r   )r  r  )r   )rL  r   r  r  r\   r
   r  )rC  r6   r   r   r   r   r    s    r  c            *   @   s8  e Zd Zddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*g*Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Z	d7d8 Z
d9d: Zd;d< Zd=d> Zd?d@ ZdAdB ZdCdD ZdEdF ZdGdH ZdIdJ ZdKdL ZdMdN ZdOdP ZdQdR ZdSdT ZdUdV ZdWdX ZdYdZ Zdad]d^Zdbd_d`Zd[S )cfprocleading_commentstrailing_commentstop_ssl
fproc_typer   r   
body_linesend_ssl
name_plainr  argsbody_lines_processed_alreadyrQ  rZ  declarationsr`  r   r@  rt  rx  r  r  r  r  r  
args_fdecluses_common	uses_saverM  r  r  uses_iargc_getarg_fmt_counts_by_statement_label_common_name_by_identifier_equivalence_info_classified_equivalence_info_target_statement_labelsdynamic_parameters	needs_cmnis_passed_as_external"externals_passed_by_arg_identifier	conv_hookc	       	      C   s  |dkst || _g | _|| _|| _|| _|| _|| _|| _| j	|d d| _
t | _g | _g | _g | _g | _g | _g | _i | _|   g | _g | _g | _d | _d | _d | _d | _d| _d| _d| _d| _ d | _!d | _"d | _#d | _$d | _%t& | _'d | _(d| _)i | _*d | _+d S )N)programfunction
subroutine	blockdata)r   F),r=   r  r  r  r  r  r  r   r   set_name_and_argsr  r   Zkeyed_listsrQ  rZ  r  r`  r   r@  rt  rx  init_implicitr  r  r  r  r  r  r  rM  r  r  r  r  r  r  r  r  setr  r  r  r  r  )	r   r  r  r  r   r   r   r  r  r   r   r   rS     sR    	
zfproc.__init__c             C   s
   | j dkS )Nr  )r  )r   r   r   r   
is_program#  r   zfproc.is_programc             C   s
   | j dkS )Nr  )r  )r   r   r   r   r   $  r   zfproc.is_functionc             C   s
   | j dkS )Nr  )r  )r   r   r   r   r   %  r   zfproc.is_subroutinec             C   s
   | j dkS )Nr  )r  )r   r   r   r   is_blockdata&  r   zfproc.is_blockdatac             C   s:   t | jdkstt | jd jdks*t| jd jd S )Nr   )r,   r  r=   rU   )r   r   r   r   first_body_source_line(  s    zfproc.first_body_source_linec             C   sB  d | _ d | _g | _| jd krP|  s(t|dks4ttjd d | jd d| _d S |t	| j }d}| jj
||r~|t	|7 }tj| j|d}|jdd| _| jd kr|  s|  s| jj|d d	 tj| jd| jd d| _d S |jdd}|d krD|  s|  r@| j| _ tj| jj| jj| jd
 | jj d| _d S |jddr\|  rd|  d}x||}| r| j| nZ|jddr| jdkr|  | j| n*|r|  n|jddrP n|  ||}|jddr P |jdds|  d}qjW |jdd}|d k	r>|  d S )Nr   Z_unnamed)r   r   r   	recursive)r   rW   T)r   r   )r   _rp   )r   Fr   r  r   ro   )r  r  r  r  r  r=   r
   r   r  r,   rL   rz   r   r  r  r:   r   r   r   r   Zget_inside_parenthesesr  r\   )r   r   Zj_codepatrC  rV  Zneed_argr   r   r   r   r  -  sn    








zfproc.set_name_and_argsc             C   sH   t | j}| jd k	r || j || j || j || j |S )N)r   r  r  r\   r   r  r  r  )r   r6   r   r   r   all_sslg  s    

zfproc.all_sslc             C   sZ   i | _ tjd d dd}xdD ]}|| j |< qW tjd d dd}xdD ]}|| j |< qDW d S )Nreal)r   r   r   ZabcdefghopqrstuvwxyzintegerZijklmn)r  r
   r   )r   r   rR   r   r   r   r  p  s    

zfproc.init_implicitc             C   s  |j }t||krd S t||d}|dk r2|  |t|kr |d|r^| j||d d S x8dD ]0}|||rdttd| }|| ||d d S qdW |dkr|j|d |dkrttd| }|| ||d d S x6d	D ].}||rttd| }|| ||d d S qW | j	||d
d d S || }|dkr|j
|d d}|dk r`| j|||d d S |dkrr|  |dr| j||d d S |  |dkrH|j|d d}	|	d t|kr||| }
|
dkrttd|
 }|| ||d d S x<dD ]4}|||r ttd| }|| ||d d S q W |dkrN|j|d |
dr|
drt|
dd}|t|
d kr| j|||d d S x:dD ]2}||rttd| }|| ||d d S qW | j	||dd d S ||	d  }|dkr| j|||	d d d S |dkr|j|	d d}|d t|k rl||d  dkrl| j|||d d d S xDdD ]<}|||rrttd|d d  }|| ||d d S qrW |d|r| j||d d S |  |dkr||| }
|
dkr| j||d d S |
dkr6ttd|
 }|| ||d d S |dkrL|j|d x:d D ]2}||rRttd| }|| ||d d S qRW | j	||dd d S xDd!D ]<}|||rttd|d d  }|| ||d d S qW |dkr|j|d |d"r| j||d d S |dr4| j||d d S | j	||dd d S |d#kr|dkrh|j|d x:d$D ]2}||rnttd| }|| ||d d S qnW |  |dkr|d|r| j||d d S |d%|r| j||d d S |dkr|j|d x:d&D ]2}||rttd| }|| ||d d S qW |drxt|dd|krx| j||d d S | j	||d
d d S |d'|r| j||d d S x<d(D ]4}|||rttd| }|| ||d d S qW |dkr |j|d | j	||dd d S ))N)rW   r   continue)r   rW   )ZassignrF  callcyclerj  exitgotoprintreturnr  re   Zp_)r   )elseZenddoendif)rQ  rt  entryr  r  r  F)r   rW   enable_sizer   r   )r   rW   i_equal_signdorp   )
allocaterF  close
deallocaterj  inquirer   r   r  write)r  r  whiler   )rL   rW   rK   )r   rW   rc  )rQ  r`  Zdowhiler  r   rx  r  r  T)z	allocate(z
backspace(zdeallocate(zread(zwrite(rq   rZ  ro   r  )r  rF  r   r  r   r  )rQ  rZ  r`  r  )z	allocate(z
backspace(zdeallocate(zgoto(zif(zread(zwrite(zelseif(rO  )rQ  rZ  r  r  )rQ  rZ  rt  r  r  zstop')rF  r  r   r  )rL   r,   r   r:   rw  rT  rz   r  r?  process_declarationrs   process_assignmentrb  rn   r   rd  r]  r;   r|  rh  r  r  )r   r   rW   rL   Zi_lidr   prR   r   r   Zcidrc  Zi_clp2r   r   r   r~  {  s<    











	


$





















zfproc.process_body_linec       	   	   C   s~   |dkst |r"t|d\}}}nt|d\}}d }|j}|t|krR|j|d t||d\}}t| j||||d|d d S )Nr   )r   )r   )r   rW   T)r6   r   rW   r   r   r   r   )	r=   r   r   rL   r,   r:   r   r   r  )	r   r   rW   r  r   r   r   rL   r   r   r   r   r  J  s"    zfproc.process_declarationc             C   sT   |d t |jkr|  t|||d}t||d d}| jt||||d d S )Nr   )r   rW   re   )r   rW   )r   rW   r  r  )r,   rL   r:   r   r@  r\   r  )r   r   rW   r  r  r  r   r   r   r  ^  s    zfproc.process_assignmentc             C   s2   | j r
td| _ x| jD ]}| j|dd qW d S )NTr   )r   rW   )r  r=   r  r~  )r   r   r   r   r   process_body_linesf  s    
zfproc.process_body_linesc             C   s   | j dk	stt| jj xzt| j  D ]h}| j | }td|jj td|j |j	dk	rhtd|j	 |j
dk	rtd|j
j |jdk	r*td q*W t  dS )zfor debugging; not exercisedNr    z   z    parameter)r  r=   r  r  r   sortedkeysr   r   r   r   r   )r   rd   r   r   r   r   
show_fdecll  s    



zfproc.show_fdeclc                sB	   j s    jd ksti  _d" fdd	  r>t}n  sN  rTt}nd }|d k	rx j	|t
 j jd dd dd }x jD ]}|j} j|j}|d krȈ||j|j|jd q|jt
kr|jd k	r||d	 |jd k	 r||d	 |j|_|j|_q|jd k	r||d	 qW xb jD ]X}|jd
krDq0 j|j}|d k	rz|jd k	rr||d	 t|_n|td q0W xt jD ]j\}} j|j}|d kr|td}n4|jd k	r||d	 |jd k	r||jd	 t|_||_qW d# fdd	 fdd}x jD ]}||d q&W xd jjD ]X}xP|D ]H}||d}|jd k	rt||jd	 t|_|jd krN|jd	|_qNW qDW  jd k	rxb jD ]X} j|j}|d krވ|td n,|j}	|	d krt|_n|	tk	r||d	 qW x jD ]} j|j}|d krB|td n|jd k	rZ||d	 nl|j}	|	d k	r~|	tk	r~||d	 |j }|d k	r|t!k	r|t"k	r||d	 |jd krt|_ nt|_ qW xh j#D ]^} j|j}|d kr|t$d n2|jd k	r||d	 n|j}	|	d k	r||d	 qW xn j%D ]d\}
}t&j'|
d}x2|D ]*} j|j}|d krX|t(d qXW  fdd}t&j)||
d q>W x jD ]} j|j}|d k	r|jd k	rt&j'|jd}xF|D ]>} j|j}|d k	r|j d krt*|_ | j+d7  _+qW qW xV j,D ]L}xD|jD ]:}|jd } j|j}|d krF||d	d qFW q:W x> j-D ]2}|j.dkr|j/} j|j}|d kr|jt0j1kr|t$d n.|jt0j2kr|t$d d _3n|td n|j }|d ks*|tkrl|jd k	r@|d	 |jd k	rV|d	 t|_ | j+d7  _+n.|t$kr|jt0j1krn|tk	r|d	  fdd}|j4|d |j5 jd qW d _6x j7 D ]}|j }|j}	|tks|tks|tkr:|	d ks|	t
ks|	tks|j8  n|t$krZ|	d k	r|j8  n~|	d kr~ jd krxt|_nt9|_|t*krt(|_ |jd kr؈|jd	|_n.|d kr|	tkr|jd kr؈|jd	|_|: rd _6qW x( j-D ]} fd d}|j4|d qW  j;d ks(tg  _;xH jD ]>}|jd
krJq6 j|j}|d k	sft j;<| q6W x6d!D ].} j|}|d k	r~|= r~d _>P q~W  ? }x|j@D ]z}d}g }xN|D ]F}x>|jD ]4}|jd } j|j }|<| |jAr|jA}qW qW |rx|D ]}d|_A	q(W qW d S )$Nc                s$   t | |||||d  j| j< }|S )N)r   r   r   r   r   r   )r   r  r   )r   r   r   r   r   r   r6   )r   r   r   
make_fdecl  s    z3fproc.build_fdecl_by_identifier.<locals>.make_fdecl)r   r   r   r   r   c             S   s   | j d| j d d S )NzConflicting declaration: %s)r0   )r<   r   )r   r   r   r   raise_confl_decl  s    z9fproc.build_fdecl_by_identifier.<locals>.raise_confl_declc             S   s   | j d| j d d S )Nz'Conflicting or repeated declaration: %s)r0   )r<   r   )r   r   r   r   raise_confl_or_repeated_decl  s    zEfproc.build_fdecl_by_identifier.<locals>.raise_confl_or_repeated_decl)r   r   r   r   )r   r   )r   r   Fc                s2    j | jd }|d kr.|s.| d| j  |S )Nr   zUnknown data type: %s)r  r  r   r<   )r   r   r6   )r   r   r   get_implicit_data_type  s    z?fproc.build_fdecl_by_identifier.<locals>.get_implicit_data_typec                sd    j | jj}|d kr.| j| j| jd}n2| jd k	r`|jd k	rX| jjd| jj d | j|_|S )N)r   r   r   z%Conflicting or repeated dimension: %s)r0   )r  r  r   r   r   r   r<   )r   r  )r   r  r   r   set_dim_tokens  s    

z7fproc.build_fdecl_by_identifier.<locals>.set_dim_tokens)r   )r   r   )r   c                sX    j | j}|d k	rT|jd kr&t|_|jd ks:|jtkr@t|_d|_| j	d7  _	d S )NTr   )
r  r  r   r   r   r   r   r   r   r   )r   r  )r   r   r   r  	  s    
z1fproc.build_fdecl_by_identifier.<locals>.callback)r  r   r   r   )r   r   r  Tc                s  |d k	o|  } j| j}|d krp|s8| td}n&| jtjkrR| td}n| td}| j	d7  _	d S | j	d7  _	|j
tkr| jtjkr| jtjkr| jtjkr| jd| j d |s| jd| j d n|r8|j
}|j}|jd k	r$|j
d krt|_
|jd kr6| d|_q~|jd k	rR|jjdkrR|j
d kr6t|_
n|tkr|d krnt|_
n(|tk	r6|tk	r6|tk	r6| d n|tks6|tks6|tkrn~|tkr| jtjkr6| jd| j d nR|tkr| d n<|jd k	rd |_| jtjks(| jtjkr0t|_
nt|_
nF|j
d krJt|_
|jd kr~|j
tk	r~|j
tk	r~|jdd	|_d S )
N)r   r   r   zUnknown intrinsic: %s)r0   zImproper use of intrinsic: %s)r   r=  T)r   r   )rI  r  r  r   r   r   Z	set_lowerr   r   r   r   extra_set_lowerio_set_lowerr<   r   r   r   r   r   r   r   )r   r  Zfollowed_by_parenthesisr  r   vs)r   r  r  r  r   r   search_for_id_tokens_callbackM	  s|    










zFfproc.build_fdecl_by_identifier.<locals>.search_for_id_tokens_callback)r  )r  c       	         s0  |d ks|  sd S  j| j}|d k	s.t| rRtj| j}|d krbd S n| s^d S d }| j}xt	|jD ]\}}|
 stt|jdkrqt|jd }| sqt j|j}|d k	st| rd S |d kr|j|t | t|jdkr(|j|t | qt||krtd|_qtW d S )Nr   r   T)rI  r  r  r   r=   r   r   Zis_modified_info_by_namer   r   Zis_seqr,   r  r   r   
setdefaultr  addr   r   )	r   r  r  Zintrinsic_is_modified_infocalled_identifieri_argr   Zfirst_arg_tokZtf_arg)r   r   r   r  	  sB    

)ZiargcZgetarg)NNNNN)F)Br  r  r  r=   r   r   r   r  r   r  r   r   r   r  r   r  r   r   r   r  r   r  r   r   r`  rQ  listsr   r  r   rt  r   r   Zvs_externalZvs_functionr  r   rZ  r
   extract_identifiersr   r8  r   r   r   r@  rd   r  r   r   r  rM  r  r	  r  valuesr>   r   r   r  r\   r   r  equivalence_infoequiv_tok_clustersr   )r   r   r  r   r   r  Zassignment_tokensr  
fdecl_listr  r[  r\  Zid_toksr  Zdim_id_toksZ
dim_id_tokZdim_tf	equiv_tokr   r  r  
identifier
equiv_infoequiv_tok_clusterZcluster_is_modifiedZ
tf_clusterr   )r   r  r  r  r   build_fdecl_by_identifier|  s       	





 


















	








F






 
# 




zfproc.build_fdecl_by_identifierc             C   s   | j |j S )N)r  r   )r   r   r   r   r   	get_fdecl	  s    zfproc.get_fdeclc             C   s   | j s
t| j}|d krddlm} | }x`| jD ]V}|jdkr2|jd kr2|jj	}|d k	r2t
|dkr2|d }| r2||j  d7  < q2W |S )Nr   )dict_with_default_0)r   r  r  r   )r  r=   r  libtbxr  r@  rd   r6  r4  r  r,   rY  r   )r   r6   r  r  tlr   r   r   r   fmt_counts_by_statement_label	  s    
z#fproc.fmt_counts_by_statement_labelc             C   sl   | j }|d krhi }xN| j D ]@\}}x6|D ].}|jj}||krR|jjd| d |||< q,W qW || _ |S )Nz4Identifier appears in multiple COMMON statements: %s)r0   )r  rQ  r   r   r   r<   )r   r6   rR  r  r   r  r   r   r   common_name_by_identifier
  s    

zfproc.common_name_by_identifierc             C   s   | j }|d krt }x&| jD ]}|jdd |jD d qW |  t }x"tt|j	D ]}|j
g  q\W x2| jD ](}|j
|j|jd jd j  | qxW |  || _ |S )Nc             S   s   g | ]}|j d  j qS )r   )r   )r&   r   r   r   r   r)   
  s    z*fproc.equivalence_info.<locals>.<listcomp>)Zkey_clusterr   )r  r   Zcluster_unionsr  r   Ztidyr  r   r,   Zunionsr  r\   rb   set_derived)r   r6   cur  r   r   r   r   r  
  s"    
zfproc.equivalence_infoc             C   s   | j d k	st| j}|d krt }|  }x|jD ]}d}xr|D ]j}xd|jD ]Z}|jd j}| j | }| rtd}	n(| rd}	n|	 rd}	n|j
dd t||	}qLW q@W |dkstt|ddd	g|d  }
|
j|j|  q2W |  || _|S )
Nr   r#   r   r   zInvalid EQUIVALENCE)r0   localr  rQ  )r  r=   r  classified_equivalence_infor  r  r   r   r   r   r<   rm   r  r\   equiv_tok_cluster_by_identifierr  )r   r6   r  r  Zhighest_priorityr  r   r  r   priorityslotr   r   r   r  (
  s4    

z!fproc.classified_equivalence_infoc             C   s`   |   }t| jdk| _| js\x<| j D ].}| r*|jj	|j
j}|d kr*d| _P q*W d S )Nr   T)r  r,   rZ  r  r  r
  r   rQ  r  r  r   r   )r   Zceir   r  r   r   r   set_uses_saveE
  s    
zfproc.set_uses_savec             C   s  | j }| j d kri }x| jD ]}|jdkrJ||jjg |j q |jdkrzx"|jD ]}||jg | q\W q |jdkr|jj	d k	rt
j|jj	d}||jg | q |jdkr|jj	d k	rt
j|jj	d}||jg | q |jdkr2|jj	d k	rt
j|jj	d}||jg | q |jdkrr|jj	d k	rt
j|jj	d}||jg | q |jdkr |j}|d k	r xBd	D ]:}t||}|d k	rt
j|d}||jg | qW q W || _ |S )
Nr  )Zgoto_computedZif_arithmeticr   )r   r  r  Zfile_positioning)r   r  )r  r  )r  r@  rd   r  rD   r   r\   r+  r2  r  r
   Zget_statement_label_tokenr  r0  r  r4  r  )r   r6   r  r   r4  r  r   r   r   r   target_statement_labelsQ
  sF    







zfproc.target_statement_labelsc             C   sx   || j krdS | j|}|d kr&dS |j}|d kr8dS tj||d}|d krRdS d||f }|| | j|||dS )NF)r   allow_powerz%s = %s)r   ro  r"  )r  r  r  r   r
   tokens_as_python_coder\   $_eval_const_expression_simple_tokens)r   r  ro  r"  r   r   rL   exprr   r   r   (_eval_const_expression_simple_identifierv
  s     


z.fproc._eval_const_expression_simple_identifierc             C   s0   x*t j|dD ]}| j|j||dsdS qW dS )N)r   )r  ro  r"  FT)r
   r	  r&  r   )r   r   ro  r"  r   r   r   r   r$  
  s
    z*fproc._eval_const_expression_simple_tokensNTc       	      C   s   | j d k	std| j kst||gd dks2tg }|d kr|tj||d}|d krXd S |d|  | j|||dsd S n| j|||dsd S |  d	|}i }i }t
||| |d kr|d }n|| }t|trt||krt|}|S )Nr  r   )r   r"  z_ = %s)r   ro  r"  )r  ro  r"  r!   )r  r=   countr
   r#  r\   r$  r&  reverser.   execr`   floatr|   )	r   r  r   r"  ro  rL   Zexec_globalsZexec_localsr6   r   r   r   eval_const_expression_simple
  s6    


z"fproc.eval_const_expression_simplec          	   C   s   g }x|D ]}t j|dr&|d  q
xt|jD ]\}}|jddr2g }x<|jd | |j|d d  fD ]}|| j||d qlW |\}	}
|	d ks|
d kr|d  n||
|	 d  P q2W || j|j|d q
W |S )N)r   r   )r   r   )r   r"  )r
   r   r\   r   r   r   r+  )r   r   r"  valsr   r   r   flr   r   rQ   r   r   r   eval_dimensions_simple
  s$    
&zfproc.eval_dimensions_simple)NNT)T)r   r   r   r?   rS   r  r   r   r  r  r  r  r  r~  r  r  r  r  r  r  r  r  r  r  r   r!  r&  r$  r+  r.  r   r   r   r   r    s   3:	 P  z%	
r  c               @   s(   e Zd ZddddgZdd Zdd Zd	S )
r  r  r  identifier_clusters identifier_cluster_by_identifierc             C   s
   g | _ d S )N)r  )r   r   r   r   rS   
  s    zequivalence_info.__init__c             C   s~   i | _ g | _i | _xf| jD ]\}g }| j| xF|D ]>}x8|jD ].}|jd j}|| j |< || || j|< q@W q4W qW d S )Nr   )r  r/  r0  r  r\   r   )r   r  Zidentifier_clusterr  r   r  r   r   r   r  
  s    


zequivalence_info.set_derivedN)r   r   r   r?   rS   r  r   r   r   r   r  
  s   r  c               @   s.   e Zd ZdddgZdd Zdd Zdd	 Zd
S )r  rQ  r  r  c             C   s"   x| j D ]}t| |t  qW d S )N)r?   r   r  )r   r  r   r   r   rS   
  s    z$classified_equivalence_info.__init__c             C   s"   x| j D ]}t| |  qW d S )N)r?   r  r  )r   r  r   r   r   r  
  s    z'classified_equivalence_info.set_derivedc             C   s   t | jjdkS )Nr   )r,   r  r  )r   r   r   r   has_save
  s    z$classified_equivalence_info.has_saveN)r   r   r   r?   rS   r  r1  r   r   r   r   r  
  s   
r  c               @   sd   e Zd ZdddddddgZdd	 Zd
d Zdd ZdddZdd Zdd Z	dddZ
dddZdS )split_fprocsr  r  r  r  all_in_input_order_fprocs_by_name_fprocs_by_name_plainc             C   s.   g | _ g | _g | _g | _g | _d | _d | _d S )N)r  r  r  r  r3  r4  r5  )r   r   r   r   rS   
  s    zsplit_fprocs.__init__c             C   s   | j | j| j| jgS )N)r  r  r  r  )r   r   r   r   by_type  s    zsplit_fprocs.by_typec                s2  t |g xD ]}| r*| qt|jdks<td fdd	}xdD ]D}|dkrl|jdsx|j|rTt ||||dd d d P qTW t|dd	\}}}|d ks|jd
|s j	|dd dd d |d n j
|d
||||d g qW tdkr.t jdkr. jd _d S )Nr   c       
         s   g }|d k	r| | d|  }xLD ]D}|jd|gkr^t|| |||||d}	 j |	 |	S | | q$W |d krx|}|jd|   d d S )Nr  )r  r  r  r   r   r   r  r  zMissing END for %s)r0   )r\   rL   r  r3  r9   upper)
r  r  r   r   r   first_body_liner  Zspecific_endr   r6   )r   r  sslsr   r   collect_until_end  s*    

z/split_fprocs.process.<locals>.collect_until_end)r  r  r  r  r  Zrecursivesubroutine)r  r  r   r   r   T)r   r   r  r  )r  r  r   r   r   r8  rq   )N)iterr_   r\   r,   rL   r=   rz   r  r   r  r  r3  r  )r   r   Zcurr_sslr:  r  r   r   r   r   )r   r  r9  r   process  sN    




zsplit_fprocs.processNr   c          	   C   s\   |d krt j}t|d |d x8| jd d D ]&}t|d|tt| |f  |d q.W d S )Nz!Counts by Fortran procedure type:)r  rH  z  %s: %s)sysstdoutr  r?   r,   r  )r   outr(   r  r   r   r   show_counts_by_typeI  s
     z split_fprocs.show_counts_by_typec             C   s   x| j D ]}|  qW d S )N)r3  r  )r   r  r   r   r   r  O  s    zsplit_fprocs.process_body_linesc             C   s   x| j D ]}|  qW d S )N)r3  r  )r   r  r   r   r   r  S  s    z&split_fprocs.build_fdecl_by_identifierFc          
   C   s  | j d kri | _ i | _x|  D ]}x|D ]}| j |jj}|d k	rdg}x`|j|jgD ]P}|jd kr|dt||jj|	 
 f  qZ||jdt| dd qZW ddlm} |d||| j |jj< |jd k	r*|| j|jj< q*W q W |r| jS | j S )	Nz Fortran procedure name conflict:z,  %d. definition: %s (implied)
    before %sz%d. definitionz  )r0   r(   r   )Sorryr!   )r4  r5  r6  r  r  r   r   r\   r,   r  r-   r7   libtbx.utilsrA  r.   r  )r   plainZfprocsr  otherr0   r  rA  r   r   r   fprocs_by_nameW  s2    



zsplit_fprocs.fprocs_by_namec             C   s   t | |dS )N)
all_fprocstop_procedures)*build_bottom_up_fproc_list_following_calls)r   rG  r   r   r   rH  u  s    z7split_fprocs.build_bottom_up_fproc_list_following_calls)Nr   )F)N)r   r   r   r?   rS   r6  r<  r@  r  r  rE  rH  r   r   r   r   r2  
  s   	B

r2  c               @   s8   e Zd ZdddddddgZdd	d
Zdd Zdd ZdS )rH  rF  rG  deps_by_fproc_identifierbottom_up_listforward_uses_by_identifierdependency_cycles%missing_external_fdecls_by_identifierNc                s  | _ | _ j  x j jD ]~}xx|j D ]j}| r0|jtk	r0t	|j
dkr0fdd|jj}|}|d k	rd|_|t|jjg|d q0W q W i  _i  fdd jd kst	 jdkrg }x j jD ]}||jj|df qW ng }x jD ]z}	xr|	d	D ]d}
|
}|d krFd
|
 }|d kr\td|
 ||
  fdd|d q W qW | _g }x: j jD ].}|jj jkr||jj|df qW ddlm} t|}g  _t }i  _t }i  _x|j|dD ]}|}|d k	r j| || xp|| D ]B}||krL||krL||krL j|g | || qLW n ||jddkr|  j|< qW |j|d _d S )Nr   c       	         s   x|j  D ]~\}} |}|d kr(qx`|D ]X}|j| j}|j|t }| |kr.||  ||kr.|| | ||j	| d q.W qW d S )N)primary_external_identifierprocs_visited_alreadycaller_fdecl)
r   r   r  r  r   r  r  r  r  r  )	rN  rO  rP  Zcalled_nameZ	i_arg_setcalled_fprocr  Zarg_identifier	primaries)rE  #recursively_update_externals_passedr   r   rS    s$    




z`build_bottom_up_fproc_list_following_calls.__init__.<locals>.recursively_update_externals_passedT)rN  rO  rP  c                s   t  }x| j D ]}|| qW x`t| j D ]N}|| jjkrFq4| j| }|	 r4|j
tk	r4||jj |g | q4W |  rx jjD ]}||jj qW t|}| j| jj< |S )N)r  r  r
  updater  r  r  r  r   r   r   r   r  r   r  r\   r  rF  r  rI  )r  depsrR  r  r   br6   )r   external_fdeclsr   r   get_dependencies  s"     

zMbuild_bottom_up_fproc_list_following_calls.__init__.<locals>.get_dependencies)r  ro   Zprogram_z"Unknown Fortran procedure name: %sc                s@   x:| dD ],}| j krq|}|d k	r|d qW d S )N)r  )rI  r  )r  r  Z
next_fproc)r   rE  rX  recurser   r   rY    s    

zDbuild_bottom_up_fproc_list_following_calls.__init__.<locals>.recurse)topological_sort)Zconnections)rC  )successors_by_node) rF  rG  rE  r3  r  r
  r   r   r   r,   r   r   r   r  r  r  r  rI  r\   r  RuntimeErrorr  rZ  dictrJ  rK  rM  Zstabler  r  Zstrongly_connected_componentsrL  )r   rF  rG  r  r   rN  Zprimary_fprocZ connections_for_topological_sortZtop_procedures_tidyZtop_procedure_or_proceduresZtop_procedureZ	top_fprocrZ  r[  Zbottom_up_setZforward_uses_setr  depr   )r   rW  rE  rX  rY  rS  r   rS     s    













z3build_bottom_up_fproc_list_following_calls.__init__c       
      C   s   | j  }x| jD ]}x|j D ]}x|j D ]z\}}|j|}|d krT|g}xV|D ]N}||}|d k	rZx6t	|D ]*}|t
|jkrqz|j| }	|	jrzd|_qzW qZW q2W q"W qW | S )NT)rF  rE  rJ  r  r
  r   r   r  r  r  r,   r  r   )
r   rE  caller_fprocrP  r  Zi_argsrR  rQ  r  Z	arg_fdeclr   r   r   each_fproc_update_is_modified  s$    



zHbuild_bottom_up_fproc_list_following_calls.each_fproc_update_is_modifiedc             C   s   | j  }t| j jdk}x| jD ]z}|jpV|jpV|jpV|jpV|rJ|	 pVt|j
dk|_|js"x:| j|jjg D ]$}||}|d k	rt|jrtd|_P qtW q"W | S )Nr   T)rF  rE  r,   r  rJ  r  r  rM  r  r  r  r  rI  r  r  r   )r   rE  Zhave_blockdatar_  Z
dependencyrQ  r   r   r   each_fproc_update_needs_cmn  s"    


zFbuild_bottom_up_fproc_list_following_calls.each_fproc_update_needs_cmn)N)r   r   r   r?   rS   r`  ra  r   r   r   r   rH  y  s   
trH  c             C   s~   |r|st t }dd l}| }x"| D ]}|jt|||dd q(W |sz|  x&|jD ]}|  |	  |
  qZW |S )Nr   )rP   rB   r   )r   )r=   r2  	itertoolsr'  r<  r   r  r3  r  r   r!  )
file_namesZ
basic_onlyr   rF  rb  rP   rB   r  r   r   r   r<     s     
r<  )F)r   NFF)r   F)r   F)N)FF)f
__future__r   r   r   	six.movesr   fabler   r   r   r	   r
   r   r   r   r=  r   	Exceptionr   objectr   r@   rT   rv   rc   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r/   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r  r  r  r!  r#  r$  r%  r&  r'  r(  r)  r*  r,  r-  r.  r/  r1  r3  r7  r9  r;  r<  r?  r  r  r  rK  r  rD  r  r  r  r  r2  rH  r<  r   r   r   r   <module>   s   1>sjR
   
1@



2
    $4

         
 (