def p_param_list2(self, p):
     '''param_list : param_pair'''
     p[0] = ASTNode('param_list', p[1])
 def p_value_pair(self, p):
     '''value_pair : id_or_str ASSIGN id_or_str'''
     p[0] = ASTNode('value_pair', p[1], p[3])
 def p_command_def1(self, p):
     '''command_def : CMD ID param_list NEWLINE'''
     p[0] = ASTNode('cmd', p[2], p[3])
 def p_pure_val_list2(self, p):
     '''pure_val_list : id_or_str'''
     p[0] = ASTNode('pure_val_list', p[1])
 def p_subst_val_list2(self, p):
     '''subst_val_list : value_pair'''
     p[0] = ASTNode('subst_val_list', p[1])
 def p_launcher1(self, p):
     '''launcher : label_def  body_def'''
     p[0] = ASTNode('launcher', p[1], p[2])
 def p_control_def6(self, p):
     '''control_def : param LIST val_list NEWLINE'''
     p[0] = ASTNode('list', p[1], p[3], '')
 def p_control_def3(self, p):
     '''control_def : param SELECT val_list ctrl_label NEWLINE'''
     p[0] = ASTNode('select', p[1], p[3], p[4])
 def p_control_def4(self, p):
     '''control_def : param SELECT val_list NEWLINE'''
     p[0] = ASTNode('select', p[1], p[3], '')
 def p_control_def1(self, p):
     '''control_def : param INPUT width def_val ctrl_label NEWLINE'''
     p[0] = ASTNode('input', p[1], p[3], p[4], p[5])
 def p_control_def2(self, p):
     '''control_def : param INPUT width def_val NEWLINE'''
     p[0] = ASTNode('input', p[1], p[3], p[4], '')
 def p_body_def2(self, p):
     '''body_def : line_def'''
     p[0] = ASTNode('body', p[1])
 def p_label_def1(self, p):
     '''label_def : LABEL  id_or_str  NEWLINE'''
     p[0] = ASTNode('label', p[2])
 def p_launcher2(self, p):
     '''launcher : SEPARATOR'''
     p[0] = ASTNode('sep', p[1])
 def p_param_pair(self, p):
     '''param_pair : id_or_str ASSIGN rhs'''
     p[0] = ASTNode('param_pair', p[1], p[3])
 def p_control_def5(self, p):
     '''control_def : param LIST val_list ctrl_label NEWLINE'''
     p[0] = ASTNode('list', p[1], p[3], p[4])
 def p_break(self, p):
     '''break : BREAK NEWLINE'''
     p[0] = ASTNode('break')
 def p_launchers_def1(self, p):
     '''launchers : launcher'''
     p[0] = ASTNode('launchers', p[1])