U ��_�! � @ sh d dl Z d dlmZ G dd� de�ZG dd� de�ZdZdZed krdd dl Z ed �Z e �edd�� dS ) � N)�Templatec @ s( e Zd Zd dd�Zd dd�Zdd� ZdS )�ASTCodeGenerator� _c_ast.cfgc C s || _ dd� | �|�D �| _dS )zN Initialize the code generator from a configuration file. c S s g | ]\}}t ||��qS � )�NodeCfg)�.0�name�contentsr r �/_ast_gen.py� <listcomp> s �z-ASTCodeGenerator.__init__.<locals>.<listcomp>N)�cfg_filename� parse_cfgfile�node_cfg)�selfr r r r �__init__ s �zASTCodeGenerator.__init__Nc C sD t t�j| jd�}|t7 }| jD ]}||�� d 7 }q |�|� dS )z< Generates the code into file, an open file buffer. )r z N)r �_PROLOGUE_COMMENTZ substituter �_PROLOGUE_CODEr �generate_source�write)r �file�srcr r r r �generate s � zASTCodeGenerator.generatec c s� t |d���}|D ]�}|�� }|r|�d�r,q|�d�}|�d�}|�d�}|dk sb||ksb||krrtd||f ��|d|� }||d |� }|r�d d � |�d�D �ng } || fV qW 5 Q R X dS )ze Parse the configuration file and yield pairs of (name, contents) for each node. �r�#�:�[�]� zInvalid line in %s: %s Nc S s g | ]}|� � �qS r )�strip)r �vr r r r 7 s z2ASTCodeGenerator.parse_cfgfile.<locals>.<listcomp>�,)�openr � startswith�find�RuntimeError�split) r �filename�f�lineZcolon_iZ lbracket_iZ rbracket_ir �valZvallistr r r r &