%{ /* * Copyright (c) 2020 NVI, Inc. * * This file is part of VLBI Field System * (see http://github.com/nvi-inc/fs). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include "vex.h" #define YYDEBUG 1 /* globals */ struct vex *vex_ptr=NULL; extern int lines; int yylex(); void yyerror(char const* s); %} %union { int ival; char *sval; struct llist *llptr; struct qref *qrptr; struct def *dfptr; struct block *blptr; struct lowl *lwptr; struct dvalue *dvptr; struct external *exptr; struct chan_def *cdptr; struct switching_cycle *scptr; struct station *snptr; struct source *soptr; struct intent *inptr; struct data_transfer *dtptr; struct pointing_offset *ptptr; struct axis_type *atptr; struct antenna_motion *amptr; struct pointing_sector *psptr; struct nasmyth *nsptr; struct bbc_assign *baptr; struct stream_def *sdptr; struct stream_sample_rate *ssptr; struct stream_label *slptr; struct headstack *hsptr; struct clock_early *ceptr; struct tape_length *tlptr; struct tape_motion *tmptr; struct equip *eqptr; struct composite_equip *cqptr; struct equip_set *esptr; struct equip_info *eiptr; struct connection *coptr; struct record_method *rmptr; struct datastream *daptr; struct thread *thptr; struct channel *chptr; struct merged_datastream *mdptr; struct eop_origin *eoptr; struct nut_origin *noptr; struct exper_name *enptr; struct scheduling_software *schsptr; struct vex_file_writer *vfwptr; struct extension *etptr; struct headstack_pos *hpptr; struct if_def *ifptr; struct receiver_name *rnptr; struct sub_lo_frequencies *sfptr; struct sub_lo_sidebands *sbptr; struct switched_power *swptr; struct phase_cal_detect *pdptr; struct setup_always *saptr; struct parity_check *pcptr; struct tape_prepass *tpptr; struct preob_cal *prptr; struct midob_cal *miptr; struct postob_cal *poptr; struct sefd *septr; struct site_id *siptr; struct site_position *spptr; struct site_velocity *svptr; struct ocean_load_vert *ovptr; struct ocean_load_horiz *ohptr; struct source_type *stptr; struct source_model *smptr; struct datum *dmptr; struct c_vector *vrptr; struct vsn *vsptr; struct fanin_def *fiptr; struct fanout_def *foptr; struct vlba_frmtr_sys_trk *fsptr; struct s2_data_source *dsptr; struct format_def *fmptr; struct thread_def *thdptr; struct channel_def *chdptr; } %token T_VEX_REV T_REF T_DEF T_ENDDEF T_SCAN T_ENDSCAN %token T_CHAN_DEF T_SAMPLE_RATE T_BITS_PER_SAMPLE T_SWITCHING_CYCLE %token T_START T_SOURCE T_MODE T_STATION T_DATA_TRANSFER T_INTENT %token T_POINTING_OFFSET %token T_ANTENNA_DIAM T_AXIS_OFFSET T_ANTENNA_MOTION T_POINTING_SECTOR %token T_AXIS_TYPE T_NASMYTH %token T_BBC_ASSIGN %token T_STREAM_DEF T_STREAM_SAMPLE_RATE T_STREAM_LABEL %token T_CLOCK_EARLY %token T_RECORD_TRANSPORT_TYPE T_ELECTRONICS_RACK_TYPE T_NUMBER_DRIVES %token T_HEADSTACK T_RECORD_DENSITY T_TAPE_LENGTH %token T_RECORDING_SYSTEM_ID T_TAPE_MOTION T_TAPE_CONTROL %token T_EQUIP T_COMPOSITE_EQUIP T_EQUIP_SET T_EQUIP_INFO T_CONNECTION %token T_RECORD_METHOD T_RECORD_CONTROL %token T_DATASTREAM T_THREAD T_CHANNEL T_MERGED_DATASTREAM %token T_TAI_UTC T_A1_TAI T_EOP_REF_EPOCH T_NUM_EOP_POINTS %token T_EOP_INTERVAL T_UT1_UTC T_X_WOBBLE T_Y_WOBBLE %token T_NUT_REF_EPOCH T_NUM_NUT_POINTS T_NUT_INTERVAL T_DELTA_PSI %token T_DELTA_EPS T_NUT_MODEL %token T_EOP_ORIGIN T_DELTA_X_NUT T_DELTA_Y_NUT T_NUT_ORIGIN %token T_EXPER_NUM T_EXPER_NAME T_EXPER_NOMINAL_START %token T_EXPER_NOMINAL_STOP T_PI_NAME T_PI_EMAIL T_CONTACT_NAME %token T_CONTACT_EMAIL T_SCHEDULER_NAME T_SCHEDULER_EMAIL %token T_TARGET_CORRELATOR T_EXPER_DESCRIPTION T_SCHEDULING_SOFTWARE %token T_VEX_FILE_WRITER %token T_EXTENSION %token T_HEADSTACK_POS %token T_IF_DEF T_RECEIVER_NAME T_SUB_LO_FREQUENCIES %token T_SUB_LO_SIDEBANDS T_SWITCHED_POWER %token T_PASS_ORDER %token T_S2_GROUP_ORDER %token T_PHASE_CAL_DETECT %token T_TAPE_CHANGE T_NEW_SOURCE_COMMAND T_NEW_TAPE_SETUP %token T_SETUP_ALWAYS T_PARITY_CHECK T_TAPE_PREPASS T_PREOB_CAL %token T_MIDOB_CAL T_POSTOB_CAL T_HEADSTACK_MOTION %token T_PROCEDURE_NAME_PREFIX %token T_ROLL_REINIT_PERIOD T_ROLL_INC_PERIOD T_ROLL T_ROLL_DEF %token T_SEFD_MODEL T_SEFD %token T_SITE_TYPE T_SITE_NAME T_SITE_ID T_SITE_POSITION %token T_SITE_POSITION_EPOCH T_SITE_POSITION_REF T_SITE_VELOCITY %token T_HORIZON_MAP_AZ T_HORIZON_MAP_EL T_ZEN_ATMOS %token T_OCEAN_LOAD_VERT T_OCEAN_LOAD_HORIZ T_OCCUPATION_CODE %token T_INCLINATION T_ECCENTRICITY T_ARG_PERIGEE T_ASCENDING_NODE %token T_MEAN_ANOMALY T_SEMI_MAJOR_AXIS T_MEAN_MOTION T_ORBIT_EPOCH %token T_SOURCE_TYPE T_SOURCE_NAME T_IAU_NAME T_RA T_DEC %token T_SOURCE_POSITION_REF T_RA_RATE T_DEC_RATE %token T_SOURCE_POSITION_EPOCH T_REF_COORD_FRAME %token T_VELOCITY_WRT_LSR T_SOURCE_MODEL %token T_BSP_FILE_NAME T_BSP_OBJECT_ID %token T_TLE0 T_TLE1 T_TLE2 T_DATUM T_VECTOR %token T_VSN %token T_FANIN_DEF T_FANOUT_DEF T_TRACK_FRAME_FORMAT T_DATA_MODULATION %token T_VLBA_FRMTR_SYS_TRK T_VLBA_TRNSPRT_SYS_TRK %token T_S2_RECORDING_MODE T_S2_DATA_SOURCE %token T_FORMAT_DEF T_THREAD_DEF T_CHANNEL_DEF %token B_GLOBAL B_STATION B_MODE B_SCHED %token B_EXPER B_SCHEDULING_PARAMS B_PROCEDURES B_EOP B_FREQ B_CLOCK %token B_ANTENNA B_BBC B_CORR B_DAS B_HEAD_POS B_PASS_ORDER %token B_PHASE_CAL_DETECT B_ROLL B_IF B_SEFD B_SITE B_SOURCE B_TRACKS %token B_TAPELOG_OBS B_BITSTREAMS B_THREADS B_DATASTREAMS B_EXTENSIONS %token T_LITERAL %token T_NAME T_LINK T_ANGLE %token T_COMMENT T_COMMENT_TRAILING %type version %type version_lowls %type version_lowl %type block %type blocks %type global_block %type station_block station_defs %type station_def %type station_defx %type mode_block mode_defs %type mode_def %type mode_defx %type qrefs refs qualifiers %type primitive %type qref ref %type refx qrefx %type sched_block sched_defs sched_lowls %type sched_def %type sched_lowl sched_defx %type start mode %type source %type source_stations %type source_station %type start_position %type station %type drives %type pass sector %type data_transfer %type intent %type pointing_offset %type scan_id method destination options %type unit_value2 %type antenna_block antenna_defs antenna_lowls %type antenna_def %type antenna_lowl antenna_defx %type antenna_diam axis_offset %type axis_type %type antenna_motion %type pointing_sector %type nasmyth %type bbc_block bbc_defs bbc_lowls %type bbc_def %type bbc_lowl bbc_defx %type bbc_assign %type bitstreams_block bitstreams_defs bitstreams_lowls %type bitstreams_def %type bitstreams_lowl bitstreams_defx %type stream_def %type stream_sample_rate %type stream_label %type clock_block clock_defs clock_lowls %type clock_def %type clock_lowl clock_defx %type clock_early %type das_block das_defs das_lowls %type das_def %type das_lowl das_defx %type record_transport_type electronics_rack_type tape_control %type number_drives %type record_density recording_system_id %type headstack %type tape_length %type tape_motion %type equip %type composite_equip %type link_list %type equip_set %type equip_info %type connection %type record_method %type record_control %type datastreams_block datastreams_defs datastreams_lowls %type datastreams_def %type datastreams_lowl datastreams_defx %type datastream %type thread %type channel %type merged_datastream %type eop_block eop_defs eop_lowls %type eop_def %type eop_lowl eop_defx %type tai_utc a1_tai num_eop_points eop_interval %type eop_ref_epoch %type ut1_utc x_wobble y_wobble %type nut_ref_epoch %type num_nut_points nut_interval %type delta_psi delta_eps %type nut_model %type eop_origin %type delta_x_nut delta_y_nut %type nut_origin %type exper_block exper_defs exper_lowls %type exper_def %type exper_lowl exper_defx %type exper_num %type exper_name %type exper_nominal_start exper_description %type exper_nominal_stop pi_name pi_email contact_name %type contact_email scheduler_name scheduler_email %type target_correlator %type scheduling_software %type vex_file_writer %type extensions_block extensions_defs extensions_lowls %type extensions_def %type extensions_lowl extensions_defx %type extension %type freq_block freq_defs freq_lowls %type freq_def %type freq_lowl freq_defx %type chan_def %type sample_rate bits_per_sample switch_state %type switch_states %type switching_cycle %type head_pos_block head_pos_defs head_pos_lowls %type head_pos_def %type head_pos_lowl head_pos_defx %type headstack_pos %type if_block if_defs if_lowls %type if_def %type if_lowl if_defx %type if_def_st %type receiver_name %type sub_lo_frequencies %type sub_lo_sidebands %type switched_power %type pass_order_block pass_order_defs pass_order_lowls %type pass_order_def %type pass_order_lowl pass_order_defx %type pass_order s2_group_order %type phase_cal_detect_block phase_cal_detect_defs %type phase_cal_detect_lowls %type phase_cal_detect_def %type phase_cal_detect_lowl phase_cal_detect_defx %type phase_cal_detect %type procedures_block procedures_defs procedures_lowls %type procedures_def %type procedures_lowl procedures_defx %type tape_change headstack_motion new_source_command new_tape_setup %type setup_always %type parity_check %type tape_prepass %type preob_cal %type midob_cal %type postob_cal %type procedure_name_prefix %type roll_block roll_defs roll_lowls %type roll_def %type roll_lowl roll_defx %type roll_reinit_period roll_inc_period %type roll %type roll_def_st %type scheduling_params_block scheduling_params_defs %type scheduling_params_lowls %type scheduling_params_def %type scheduling_params_lowl scheduling_params_defx %type sefd_block sefd_defs sefd_lowls %type sefd_def %type sefd_lowl sefd_defx %type sefd_model %type sefd %type site_block site_defs site_lowls %type site_def %type site_lowl site_defx %type site_type site_name occupation_code orbit_epoch %type site_position_epoch site_position_ref %type site_id %type site_position %type site_velocity %type horizon_map_az horizon_map_el %type ocean_load_vert %type ocean_load_horiz %type zen_atmos inclination eccentricity arg_perigee ascending_node %type mean_anomaly semi_major_axis mean_motion %type source_block source_defs source_lowls %type source_def %type source_lowl source_defx %type source_name iau_name ra dec source_position_ref ref_coord_frame %type source_position_epoch bsp_file_name bsp_object_id %type tle0 tle1 tle2 %type ra_rate dec_rate velocity_wrt_lsr %type source_type %type source_model %type datum %type vector %type tapelog_obs_block tapelog_obs_defs tapelog_obs_lowls %type tapelog_obs_def %type tapelog_obs_lowl tapelog_obs_defx %type vsn %type tracks_block tracks_defs tracks_lowls %type tracks_def %type tracks_lowl tracks_defx %type fanin_def %type fanout_def %type track_frame_format data_modulation s2_recording_mode %type vlba_frmtr_sys_trk %type bit_stream_list vlba_trnsprt_sys_trk %type s2_data_source %type threads_block threads_defs threads_lowls %type threads_def %type threads_lowl threads_defx %type format_def %type thread_def %type channel_def %type external_ref %type literal %type unit_list name_list value_list %type unit_more %type unit_value value value2 optional_value %type unit_option %type name_value optional_name %type name_or_not empty_name link_or_not %type empty_value %% /* start rule */ vex: version_lowls blocks {vex_ptr=make_vex($1,$2);} | version_lowls {vex_ptr=make_vex($1,NULL);} ; version_lowls: version_lowls version_lowl {$$=add_list($1,$2);} | version_lowl {$$=add_list(NULL,$1);} ; version_lowl: version {$$=make_lowl(T_VEX_REV,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; /* version number */ version: T_VEX_REV '=' T_NAME ';' {$$=make_version($3);} ; /* blocks */ blocks: blocks block {$$=add_list($1,$2);} | block {$$=add_list(NULL,$1);} ; block: global_block {$$=make_block(B_GLOBAL,$1);} | station_block {$$=make_block(B_STATION,$1);} | mode_block {$$=make_block(B_MODE,$1);} | freq_block {$$=make_block(B_FREQ,$1);} | sched_block {$$=make_block(B_SCHED,$1);} | antenna_block {$$=make_block(B_ANTENNA,$1);} | bbc_block {$$=make_block(B_BBC,$1);} | bitstreams_block {$$=make_block(B_BITSTREAMS,$1);} | clock_block {$$=make_block(B_CLOCK,$1);} | das_block {$$=make_block(B_DAS,$1);} | datastreams_block {$$=make_block(B_DATASTREAMS,$1);} | eop_block {$$=make_block(B_EOP,$1);} | exper_block {$$=make_block(B_EXPER,$1);} | extensions_block {$$=make_block(B_EXTENSIONS,$1);} | head_pos_block {$$=make_block(B_HEAD_POS,$1);} | if_block {$$=make_block(B_IF,$1);} | pass_order_block {$$=make_block(B_PASS_ORDER,$1);} | phase_cal_detect_block {$$=make_block(B_PHASE_CAL_DETECT,$1);} | procedures_block {$$=make_block(B_PROCEDURES,$1);} | roll_block {$$=make_block(B_ROLL,$1);} | scheduling_params_block {$$=make_block(B_SCHEDULING_PARAMS,$1);} | sefd_block {$$=make_block(B_SEFD,$1);} | site_block {$$=make_block(B_SITE,$1);} | source_block {$$=make_block(B_SOURCE,$1);} | tapelog_obs_block {$$=make_block(B_TAPELOG_OBS,$1);} | tracks_block {$$=make_block(B_TRACKS,$1);} | threads_block {$$=make_block(B_THREADS,$1);} ; /* $GLOBAL block */ global_block: B_GLOBAL ';' refs {$$=$3;} | B_GLOBAL ';' {$$=NULL;} ; /* $STATION block */ station_block: B_STATION ';' station_defs {$$=$3;} | B_STATION ';' {$$=NULL;} ; station_defs: station_defs station_defx {$$=add_list($1,$2);} | station_defx {$$=add_list(NULL,$1);} ; station_defx: station_def {$$=make_lowl(T_DEF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; station_def: T_DEF T_NAME ';' refs T_ENDDEF ';' {$$=make_def($2,$4);} | T_DEF T_NAME ';' T_ENDDEF ';' {$$=make_def($2,NULL);} ; /* $MODE block */ mode_block: B_MODE ';' mode_defs {$$=$3;} | B_MODE ';' {$$=NULL;} ; mode_defs: mode_defs mode_defx {$$=add_list($1,$2);} | mode_defx {$$=add_list(NULL,$1);} ; mode_defx: mode_def {$$=make_lowl(T_DEF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; mode_def: T_DEF T_NAME ';' qrefs T_ENDDEF ';' {$$=make_def($2,$4);} | T_DEF T_NAME ';' T_ENDDEF ';' {$$=make_def($2,NULL);} ; /* refs utility rules */ refs: refs refx {$$=add_list($1,$2);} | refx {$$=add_list(NULL,$1);} ; refx: ref {$$=make_lowl(T_REF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; ref: T_REF primitive '=' T_NAME ';' {$$=make_qref($2,$4,NULL);} ; primitive: B_EXPER {$$=B_EXPER;} | B_SCHEDULING_PARAMS {$$=B_SCHEDULING_PARAMS;} | B_PROCEDURES {$$=B_PROCEDURES;} | B_EOP {$$=B_EOP;} | B_FREQ {$$=B_FREQ;} | B_ANTENNA {$$=B_ANTENNA;} | B_BBC {$$=B_BBC;} | B_BITSTREAMS {$$=B_BITSTREAMS;} | B_CLOCK {$$=B_CLOCK;} | B_CORR {$$=B_CORR;} | B_DAS {$$=B_DAS;} | B_DATASTREAMS {$$=B_DATASTREAMS;} | B_EXTENSIONS {$$=B_EXTENSIONS;} | B_HEAD_POS {$$=B_HEAD_POS;} | B_PASS_ORDER {$$=B_PASS_ORDER;} | B_PHASE_CAL_DETECT {$$=B_PHASE_CAL_DETECT;} | B_ROLL {$$=B_ROLL;} | B_IF {$$=B_IF;} | B_SEFD {$$=B_SEFD;} | B_SITE {$$=B_SITE;} | B_SOURCE {$$=B_SOURCE;} | B_TRACKS {$$=B_TRACKS;} | B_TAPELOG_OBS {$$=B_TAPELOG_OBS;} | B_THREADS {$$=B_THREADS;} ; qrefs: qrefs qrefx {$$=add_list($1,$2);} | qrefx {$$=add_list(NULL,$1);} ; qrefx: qref {$$=make_lowl(T_REF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; qref: T_REF primitive '=' T_NAME qualifiers ';' {$$=make_qref($2,$4,$5);} | T_REF primitive '=' T_NAME ';' {$$=make_qref($2,$4,NULL);} ; qualifiers: qualifiers ':' T_NAME {$$=add_list($1,$3);} | ':' T_NAME {$$=add_list(NULL,$2);} ; /* $SCHED block */ sched_block: B_SCHED ';' sched_defs {$$=$3;} | B_SCHED ';' {$$=NULL;} ; sched_defs: sched_defs sched_defx {$$=add_list($1,$2);} | sched_defx {$$=add_list(NULL,$1);} ; sched_defx: sched_def {$$=make_lowl(T_SCAN,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; sched_def: T_SCAN T_NAME ';' sched_lowls T_ENDSCAN ';' {$$=make_def($2,$4);} | T_SCAN T_NAME ';' T_ENDSCAN ';' {$$=make_def($2,NULL);} ; sched_lowls: sched_lowls sched_lowl {$$=add_list($1,$2);} | sched_lowl {$$=add_list(NULL,$1);} ; sched_lowl: start {$$=make_lowl(T_START,$1);} | mode {$$=make_lowl(T_MODE,$1);} | source {$$=make_lowl(T_SOURCE,$1);} | station {$$=make_lowl(T_STATION,$1);} | data_transfer {$$=make_lowl(T_DATA_TRANSFER,$1);} | intent {$$=make_lowl(T_INTENT,$1);} | pointing_offset {$$=make_lowl(T_POINTING_OFFSET,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; start: T_START '=' T_NAME ';' {$$=$3;} ; mode: T_MODE '=' T_NAME ';' {$$=$3;} ; source: T_SOURCE '=' T_NAME ':' value2 ':' value2 source_stations ';' {$$=make_source($3,$5,$7,$8);} | T_SOURCE '=' T_NAME ':' value2 ':' value2 ';' {$$=make_source($3,$5,$7,NULL);} | T_SOURCE '=' T_NAME ':' value2 ';' {$$=make_source($3,$5,NULL,NULL);} | T_SOURCE '=' T_NAME ';' {$$=make_source($3,NULL,NULL,NULL);} ; source_stations: source_stations source_station {$$=add_list($1,$2);} | source_station {$$=add_list(NULL,$1);} ; source_station: ':' T_NAME {$$=$2;} ; station: T_STATION '=' T_NAME ':' /* name */ unit_value ':' /* data start */ unit_value ':' /* data stop */ start_position ':' pass ':' sector ':' /* pointing sector */ drives ';' {$$=make_station($3,$5,$7,$9,$11,$13,$15);} ; data_transfer: T_DATA_TRANSFER '=' scan_id ':' /* name */ method ':' /* method disk2file or in2net */ destination ':' /* filename or blank */ unit_value2 ':' /* data start */ unit_value2 ':' /* data stop */ options ';' /* future use, empty now */ {$$=make_data_transfer($3,$5,$7,$9,$11,$13);} | T_DATA_TRANSFER '=' scan_id ':' /* name */ method ':' /* method disk2file or in2net */ destination ':' /* filename or blank */ unit_value2 ':' /* data start */ unit_value2 ';' /* data stop */ {$$=make_data_transfer($3,$5,$7,$9,$11,NULL);} ; intent: T_INTENT '=' name_or_not ':' name_value ':' name_value ';' {$$=make_intent($3,$5,$7);} ; pointing_offset: T_POINTING_OFFSET '=' name_or_not ':' /* name */ name_value ':' /* coord1 */ unit_value ':' /* offset1 */ name_value ':' /* coord2 */ unit_value ';' /* offset2 */ {$$=make_pointing_offset($3,$5,$7,$9,$11);} ; start_position: /* empty */ {$$=NULL;} | unit_value {$$=$1;} ; pass: /* empty */ {$$=NULL;} | T_NAME {$$=$1;} ; sector: /* empty */ {$$=NULL;} | T_LINK {$$=$1;} ; drives: /* empty */ {$$=NULL;} | value {$$=add_list(NULL,$1);} | value ':' value {$$=add_list(add_list(NULL,$1),$3);} ; scan_id: /* empty */ {$$=NULL;} | T_NAME {$$=$1;} ; method: /* empty */ {$$=NULL;} | T_NAME {$$=$1;} ; destination: /* empty */ {$$=NULL;} | T_NAME {$$=$1;} ; options: /* empty */ {$$=NULL;} | T_NAME {$$=$1;} ; /* $ANTENNA block */ antenna_block: B_ANTENNA ';' antenna_defs {$$=$3;} | B_ANTENNA ';' {$$=NULL;} ; antenna_defs: antenna_defs antenna_defx {$$=add_list($1,$2);} | antenna_defx {$$=add_list(NULL,$1);} ; antenna_defx: antenna_def {$$=make_lowl(T_DEF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; antenna_def: T_DEF T_NAME ';' antenna_lowls T_ENDDEF ';' {$$=make_def($2,$4);} | T_DEF T_NAME ';' T_ENDDEF ';' {$$=make_def($2,NULL);} ; antenna_lowls: antenna_lowls antenna_lowl {$$=add_list($1,$2);} | antenna_lowl {$$=add_list(NULL,$1);} ; antenna_lowl: antenna_diam {$$=make_lowl(T_ANTENNA_DIAM,$1);} | axis_type {$$=make_lowl(T_AXIS_TYPE,$1);} | axis_offset {$$=make_lowl(T_AXIS_OFFSET,$1);} | antenna_motion {$$=make_lowl(T_ANTENNA_MOTION,$1);} | pointing_sector {$$=make_lowl(T_POINTING_SECTOR,$1);} | nasmyth {$$=make_lowl(T_NASMYTH,$1);} | external_ref {$$=make_lowl(T_REF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; antenna_diam: T_ANTENNA_DIAM '=' unit_value ';' {$$=$3;} ; axis_type: T_AXIS_TYPE '=' T_NAME ':' T_NAME ';' {$$=make_axis_type($3,$5,NULL);} | T_AXIS_TYPE '=' T_NAME ';' {$$=make_axis_type($3,NULL,NULL);} | T_AXIS_TYPE '=' T_NAME ':' T_NAME ':' unit_value ';' {$$=make_axis_type($3,$5,$7);} ; axis_offset: T_AXIS_OFFSET '=' unit_value ';' {$$=$3;} ; antenna_motion: T_ANTENNA_MOTION '=' T_NAME ':' unit_value ':' unit_value ';' {$$=make_antenna_motion($3,$5,$7,NULL);} | T_ANTENNA_MOTION '=' T_NAME ':' unit_value ':' unit_value ':' unit_value ';' {$$=make_antenna_motion($3,$5,$7,$9);} ; pointing_sector: T_POINTING_SECTOR '=' T_LINK ':' T_NAME ':' unit_value ':' unit_value ':' T_NAME ':' unit_value ':' unit_value ';' {$$=make_pointing_sector($3,$5,$7,$9,$11,$13,$15,NULL);} | T_POINTING_SECTOR '=' T_LINK ':' T_NAME ':' unit_value ':' unit_value ';' {$$=make_pointing_sector($3,$5,$7,$9,NULL,NULL,NULL,NULL);} | T_POINTING_SECTOR '=' T_LINK ':' T_NAME ':' unit_value ':' unit_value ':' T_NAME ':' unit_value ':' unit_value ':' T_NAME ';' {$$=make_pointing_sector($3,$5,$7,$9,$11,$13,$15,$17);} | T_POINTING_SECTOR '=' T_LINK ':' T_NAME ':' unit_value ':' unit_value ':' ':' ':' ':' T_NAME ';' {$$=make_pointing_sector($3,$5,$7,$9,NULL,NULL,NULL,$14);} ; nasmyth: T_NASMYTH '=' T_LINK ':' T_NAME ';' {$$=make_nasmyth($3,$5);} ; /* $BBC block */ bbc_block: B_BBC ';' bbc_defs {$$=$3;} | B_BBC ';' {$$=NULL;} ; bbc_defs: bbc_defs bbc_defx {$$=add_list($1,$2);} | bbc_defx {$$=add_list(NULL,$1);} ; bbc_defx: bbc_def {$$=make_lowl(T_DEF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; bbc_def: T_DEF T_NAME ';' bbc_lowls T_ENDDEF ';' {$$=make_def($2,$4);} | T_DEF T_NAME ';' T_ENDDEF ';' {$$=make_def($2,NULL);} ; bbc_lowls: bbc_lowls bbc_lowl {$$=add_list($1,$2);} | bbc_lowl {$$=add_list(NULL,$1);} ; bbc_lowl: bbc_assign {$$=make_lowl(T_BBC_ASSIGN,$1);} | external_ref {$$=make_lowl(T_REF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; bbc_assign: T_BBC_ASSIGN '=' T_LINK ':' value ':' T_LINK ';' {$$=make_bbc_assign($3,$5,$7);} ; /* $BITSTREAMS block */ bitstreams_block: B_BITSTREAMS ';' bitstreams_defs {$$=$3;} | B_BITSTREAMS ';' {$$=NULL;} ; bitstreams_defs: bitstreams_defs bitstreams_defx {$$=add_list($1,$2);} | bitstreams_defx {$$=add_list(NULL,$1);} ; bitstreams_defx: bitstreams_def {$$=make_lowl(T_DEF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; bitstreams_def: T_DEF T_NAME ';' bitstreams_lowls T_ENDDEF ';' {$$=make_def($2,$4);} | T_DEF T_NAME ';' T_ENDDEF ';' {$$=make_def($2,NULL);} ; bitstreams_lowls: bitstreams_lowls bitstreams_lowl {$$=add_list($1,$2);} | bitstreams_lowl {$$=add_list(NULL,$1);} ; bitstreams_lowl: stream_def {$$=make_lowl(T_STREAM_DEF,$1);} | stream_sample_rate {$$=make_lowl(T_STREAM_SAMPLE_RATE,$1);} | stream_label {$$=make_lowl(T_STREAM_LABEL,$1);} | external_ref {$$=make_lowl(T_REF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; stream_def: T_STREAM_DEF '=' T_LINK ':' T_NAME ':' value2 ':' value ':' T_LINK ';' {$$=make_stream_def($3,$5,$7,$9,$11);} | T_STREAM_DEF '=' T_LINK ':' T_NAME ':' value2 ':' value ';' {$$=make_stream_def($3,$5,$7,$9,NULL);} ; stream_sample_rate: T_STREAM_SAMPLE_RATE '=' unit_value ':' T_LINK ';' {$$=make_stream_sample_rate($3,$5);} | T_STREAM_SAMPLE_RATE '=' unit_value ';' {$$=make_stream_sample_rate($3,NULL);} ; stream_label: T_STREAM_LABEL '=' T_NAME ':' T_LINK ';' {$$=make_stream_label($3,$5);} | T_STREAM_LABEL '=' T_NAME ';' {$$=make_stream_label($3,NULL);} ; /* $CLOCK block */ clock_block: B_CLOCK ';' clock_defs {$$=$3;} | B_CLOCK ';' {$$=NULL;} ; clock_defs: clock_defs clock_defx {$$=add_list($1,$2);} | clock_defx {$$=add_list(NULL,$1);} ; clock_defx: clock_def {$$=make_lowl(T_DEF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; clock_def: T_DEF T_NAME ';' clock_lowls T_ENDDEF ';' {$$=make_def($2,$4);} | T_DEF T_NAME ';' T_ENDDEF ';' {$$=make_def($2,NULL);} ; clock_lowls: clock_lowls clock_lowl {$$=add_list($1,$2);} | clock_lowl {$$=add_list(NULL,$1);} ; clock_lowl: clock_early {$$=make_lowl(T_CLOCK_EARLY,$1);} | external_ref {$$=make_lowl(T_REF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; clock_early: T_CLOCK_EARLY '=' name_or_not ':' unit_value ':' T_NAME ':' unit_option ':' unit_value ':' unit_value ':' unit_value ';' {$$=make_clock_early($3,$5,$7,$9,$11,$13,$15);} | T_CLOCK_EARLY '=' name_or_not ':' unit_value ':' T_NAME ':' unit_option ':' unit_value ':' unit_value ';' {$$=make_clock_early($3,$5,$7,$9,$11,$13,NULL);} | T_CLOCK_EARLY '=' name_or_not ':' unit_value ':' T_NAME ':' unit_option ':' unit_value ':' empty_value ':' unit_value ';' {$$=make_clock_early($3,$5,$7,$9,$11,$13,$15);} | T_CLOCK_EARLY '=' name_or_not ':' unit_value ':' T_NAME ':' unit_option ':' unit_value ';' {$$=make_clock_early($3,$5,$7,$9,$11,NULL,NULL);} | T_CLOCK_EARLY '=' name_or_not ':' unit_value ':' T_NAME ':' unit_option ':' empty_value ':' empty_value ':' unit_value ';' {$$=make_clock_early($3,$5,$7,$9,$11,$13,$15);} | T_CLOCK_EARLY '=' name_or_not ':' unit_value ':' T_NAME ':' unit_option ';' {$$=make_clock_early($3,$5,$7,$9,NULL,NULL,NULL);} | T_CLOCK_EARLY '=' name_or_not ':' unit_value ':' empty_name ':' empty_value ':' empty_value ':' empty_value ':' unit_value ';' {$$=make_clock_early($3,$5,$7,$9,$11,$13,$15);} | T_CLOCK_EARLY '=' name_or_not ':' unit_value ';' {$$=make_clock_early($3,$5,NULL,NULL,NULL,NULL,NULL);} ; /* $DAS block */ das_block: B_DAS ';' das_defs {$$=$3;} | B_DAS ';' {$$=NULL;} ; das_defs: das_defs das_defx {$$=add_list($1,$2);} | das_defx {$$=add_list(NULL,$1);} ; das_defx: das_def {$$=make_lowl(T_DEF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; das_def: T_DEF T_NAME ';' das_lowls T_ENDDEF ';' {$$=make_def($2,$4);} | T_DEF T_NAME ';' T_ENDDEF ';' {$$=make_def($2,NULL);} ; das_lowls: das_lowls das_lowl {$$=add_list($1,$2);} | das_lowl {$$=add_list(NULL,$1);} ; das_lowl: record_transport_type {$$=make_lowl(T_RECORD_TRANSPORT_TYPE,$1);} | electronics_rack_type {$$=make_lowl(T_ELECTRONICS_RACK_TYPE,$1);} | number_drives {$$=make_lowl(T_NUMBER_DRIVES,$1);} | headstack {$$=make_lowl(T_HEADSTACK,$1);} | record_density {$$=make_lowl(T_RECORD_DENSITY,$1);} | tape_length {$$=make_lowl(T_TAPE_LENGTH,$1);} | recording_system_id {$$=make_lowl(T_RECORDING_SYSTEM_ID,$1);} | tape_motion {$$=make_lowl(T_TAPE_MOTION,$1);} | tape_control {$$=make_lowl(T_TAPE_CONTROL,$1);} | equip {$$=make_lowl(T_EQUIP,$1);} | composite_equip {$$=make_lowl(T_COMPOSITE_EQUIP,$1);} | equip_set {$$=make_lowl(T_EQUIP_SET,$1);} | equip_info {$$=make_lowl(T_EQUIP_INFO,$1);} | connection {$$=make_lowl(T_CONNECTION,$1);} | record_method {$$=make_lowl(T_RECORD_METHOD,$1);} | record_control {$$=make_lowl(T_RECORD_CONTROL,$1);} | external_ref {$$=make_lowl(T_REF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; record_transport_type: T_RECORD_TRANSPORT_TYPE '=' T_NAME ';' {$$=$3;} ; electronics_rack_type: T_ELECTRONICS_RACK_TYPE '=' T_NAME ';' {$$=$3;} ; number_drives: T_NUMBER_DRIVES '=' value ';' {$$=$3;} ; headstack: T_HEADSTACK '=' value ':' T_NAME ':' value ';' {$$=make_headstack($3,$5,$7);} | T_HEADSTACK '=' value ':' ':' value ';' {$$=make_headstack($3,NULL,$6);} ; record_density: T_RECORD_DENSITY '=' T_NAME T_NAME ';' {$$=make_dvalue($3,$4);} ; tape_length: T_TAPE_LENGTH '=' unit_value ';' {$$=make_tape_length($3,NULL,NULL);} | T_TAPE_LENGTH '=' unit_value ':' T_NAME ':' value ';' {$$=make_tape_length($3,$5,$7);} ; recording_system_id: T_RECORDING_SYSTEM_ID '=' value ';' {$$=$3;} ; tape_motion: T_TAPE_MOTION '=' T_NAME ';' {$$=make_tape_motion($3,NULL,NULL,NULL);} | T_TAPE_MOTION '=' T_NAME ':' unit_value ';' {$$=make_tape_motion($3,$5,NULL,NULL);} | T_TAPE_MOTION '=' T_NAME ':' unit_value ':' unit_value ':' unit_value ';' {$$=make_tape_motion($3,$5,$7,$9);} ; tape_control: T_TAPE_CONTROL '=' T_NAME ';' {$$=$3;} ; equip: T_EQUIP '=' T_NAME ':' T_NAME ':' T_LINK ':' T_NAME ';' {$$=make_equip($3,$5,$7,$9);} | T_EQUIP '=' T_NAME ':' T_NAME ':' T_LINK ';' {$$=make_equip($3,$5,$7,NULL);} ; composite_equip: T_COMPOSITE_EQUIP '=' T_LINK ':' T_LINK ':' T_LINK ';' {$$=make_composite_equip($3,ins_list($5,add_list(NULL,$7)));} | T_COMPOSITE_EQUIP '=' T_LINK ':' T_LINK ':' T_LINK ':' link_list ';' {$$=make_composite_equip($3,ins_list($5,ins_list($7,$9)));} ; equip_set: T_EQUIP_SET '=' T_LINK ':' T_NAME ':' unit_more ';' {$$=make_equip_set($3,$5,$7);} ; equip_info: T_EQUIP_INFO '=' T_LINK ':' T_NAME ':' name_list ';' {$$=make_equip_info($3,$5,$7);} ; connection: T_CONNECTION '=' T_LINK ':' T_LINK ':' T_NAME ':' name_or_not ':' T_NAME ';' {$$=make_connection($3,$5,$7,$9,$11);} | T_CONNECTION '=' T_LINK ':' T_LINK ':' T_NAME ':' T_NAME ';' {$$=make_connection($3,$5,$7,$9,NULL);} | T_CONNECTION '=' T_LINK ':' T_LINK ':' T_NAME ';' {$$=make_connection($3,$5,$7,NULL,NULL);} ; record_method: T_RECORD_METHOD '=' T_NAME ':' unit_value2 ':' unit_value ';' {$$=make_record_method($3,$5,$7);} | T_RECORD_METHOD '=' T_NAME ':' unit_value ';' {$$=make_record_method($3,$5,NULL);} | T_RECORD_METHOD '=' T_NAME ';' {$$=make_record_method($3,NULL,NULL);} ; record_control: T_RECORD_CONTROL '=' value ';' {$$=$3;} ; /* $DATASTREAMS block */ datastreams_block: B_DATASTREAMS ';' datastreams_defs {$$=$3;} | B_DATASTREAMS ';' {$$=NULL;} ; datastreams_defs: datastreams_defs datastreams_defx {$$=add_list($1,$2);} | datastreams_defx {$$=add_list(NULL,$1);} ; datastreams_defx: datastreams_def {$$=make_lowl(T_DEF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; datastreams_def: T_DEF T_NAME ';' datastreams_lowls T_ENDDEF ';' {$$=make_def($2,$4);} | T_DEF T_NAME ';' T_ENDDEF ';' {$$=make_def($2,NULL);} ; datastreams_lowls: datastreams_lowls datastreams_lowl {$$=add_list($1,$2);} | datastreams_lowl {$$=add_list(NULL,$1);} ; datastreams_lowl: datastream {$$=make_lowl(T_DATASTREAM,$1);} | thread {$$=make_lowl(T_THREAD,$1);} | channel {$$=make_lowl(T_CHANNEL,$1);} | merged_datastream {$$=make_lowl(T_MERGED_DATASTREAM,$1);} | external_ref {$$=make_lowl(T_REF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; datastream: T_DATASTREAM '=' T_LINK ':' T_NAME ':' T_NAME ';' {$$=make_datastream($3,$5,$7);} | T_DATASTREAM '=' T_LINK ':' T_NAME ';' {$$=make_datastream($3,$5,NULL);} ; thread: T_THREAD '=' T_LINK ':' T_LINK ':' value ':' value ':' unit_value ':' value ':' T_NAME ':' value ';' {$$=make_thread($3,$5,$7,$9,$11,$13,$15,$17);} ; channel: T_CHANNEL '=' T_LINK ':' T_LINK ':' T_LINK ':' value ';' {$$=make_channel($3,$5,$7,$9);} ; merged_datastream: T_MERGED_DATASTREAM '=' link_or_not ':' name_or_not ':' T_LINK ':' T_LINK ':' link_list ';' {$$=make_merged_datastream($3,$5,ins_list($7,ins_list($9,$11)));} | T_MERGED_DATASTREAM '=' link_or_not ':' name_or_not ':' T_LINK ':' T_LINK ';' {$$=make_merged_datastream($3,$5,ins_list($7,add_list(NULL,$9)));} ; /* $EOP block */ eop_block: B_EOP ';' eop_defs {$$=$3;} | B_EOP ';' {$$=NULL;} ; eop_defs: eop_defs eop_defx {$$=add_list($1,$2);} | eop_defx {$$=add_list(NULL,$1);} ; eop_defx: eop_def {$$=make_lowl(T_DEF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; eop_def: T_DEF T_NAME ';' eop_lowls T_ENDDEF ';' {$$=make_def($2,$4);} | T_DEF T_NAME ';' T_ENDDEF ';' {$$=make_def($2,NULL);} ; eop_lowls: eop_lowls eop_lowl {$$=add_list($1,$2);} | eop_lowl {$$=add_list(NULL,$1);} ; eop_lowl: tai_utc {$$=make_lowl(T_TAI_UTC,$1);} | a1_tai {$$=make_lowl(T_A1_TAI,$1);} | eop_ref_epoch {$$=make_lowl(T_EOP_REF_EPOCH,$1);} | num_eop_points {$$=make_lowl(T_NUM_EOP_POINTS,$1);} | eop_interval {$$=make_lowl(T_EOP_INTERVAL,$1);} | ut1_utc {$$=make_lowl(T_UT1_UTC,$1);} | x_wobble {$$=make_lowl(T_X_WOBBLE,$1);} | y_wobble {$$=make_lowl(T_Y_WOBBLE,$1);} | nut_ref_epoch {$$=make_lowl(T_NUT_REF_EPOCH,$1);} | num_nut_points {$$=make_lowl(T_NUM_NUT_POINTS,$1);} | nut_interval {$$=make_lowl(T_NUT_INTERVAL,$1);} | delta_psi {$$=make_lowl(T_DELTA_PSI,$1);} | delta_eps {$$=make_lowl(T_DELTA_EPS,$1);} | nut_model {$$=make_lowl(T_NUT_MODEL,$1);} | eop_origin {$$=make_lowl(T_EOP_ORIGIN,$1);} | delta_x_nut {$$=make_lowl(T_DELTA_X_NUT,$1);} | delta_y_nut {$$=make_lowl(T_DELTA_Y_NUT,$1);} | nut_origin {$$=make_lowl(T_NUT_ORIGIN,$1);} | external_ref {$$=make_lowl(T_REF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; tai_utc: T_TAI_UTC '=' unit_value ';' {$$=$3;} ; a1_tai: T_A1_TAI '=' unit_value ';' {$$=$3;} ; eop_ref_epoch: T_EOP_REF_EPOCH '=' T_NAME ';' {$$=$3;} ; num_eop_points: T_NUM_EOP_POINTS '=' value ';' {$$=$3;} ; eop_interval: T_EOP_INTERVAL '=' unit_value ';' {$$=$3;} ; ut1_utc: T_UT1_UTC '=' unit_list ';' {$$=$3;} | T_UT1_UTC '=' ';' {$$=NULL;} ; x_wobble: T_X_WOBBLE '=' unit_list ';' {$$=$3;} | T_X_WOBBLE '=' ';' {$$=NULL;} ; y_wobble: T_Y_WOBBLE '=' unit_list ';' {$$=$3;} | T_Y_WOBBLE '=' ';' {$$=NULL;} ; nut_ref_epoch: T_NUT_REF_EPOCH '=' T_NAME ';' {$$=$3;} ; num_nut_points: T_NUM_NUT_POINTS '=' value ';' {$$=$3;} ; nut_interval: T_NUT_INTERVAL '=' unit_value ';' {$$=$3;} ; delta_psi: T_DELTA_PSI '=' unit_list ';' {$$=$3;} | T_DELTA_PSI '=' ';' {$$=NULL;} ; delta_eps: T_DELTA_EPS '=' unit_list ';' {$$=$3;} | T_DELTA_EPS '=' ';' {$$=NULL;} ; nut_model: T_NUT_MODEL '=' T_NAME ';' {$$=$3;} ; eop_origin: T_EOP_ORIGIN '=' T_NAME ';' {$$=make_eop_origin($3,NULL);} | T_EOP_ORIGIN '=' T_NAME ':' T_NAME ';' {$$=make_eop_origin($3,$5);} ; delta_x_nut: T_DELTA_X_NUT '=' unit_list ';' {$$=$3;} | T_DELTA_X_NUT '=' ';' {$$=NULL;} ; delta_y_nut: T_DELTA_Y_NUT '=' unit_list ';' {$$=$3;} | T_DELTA_Y_NUT '=' ';' {$$=NULL;} ; nut_origin: T_NUT_ORIGIN '=' T_NAME ';' {$$=make_nut_origin($3,NULL);} | T_NUT_ORIGIN '=' T_NAME ':' T_NAME ';' {$$=make_nut_origin($3,$5);} ; /* $EXPER block */ exper_block: B_EXPER ';' exper_defs {$$=$3;} | B_EXPER ';' {$$=NULL;} ; exper_defs: exper_defs exper_defx {$$=add_list($1,$2);} | exper_defx {$$=add_list(NULL,$1);} ; exper_defx: exper_def {$$=make_lowl(T_DEF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; exper_def: T_DEF T_NAME ';' exper_lowls T_ENDDEF ';' {$$=make_def($2,$4);} | T_DEF T_NAME ';' T_ENDDEF ';' {$$=make_def($2,NULL);} ; exper_lowls: exper_lowls exper_lowl {$$=add_list($1,$2);} | exper_lowl {$$=add_list(NULL,$1);} ; exper_lowl: exper_num {$$=make_lowl(T_EXPER_NUM,$1);} | exper_name {$$=make_lowl(T_EXPER_NAME,$1);} | exper_description {$$=make_lowl(T_EXPER_DESCRIPTION,$1);} | exper_nominal_start {$$=make_lowl(T_EXPER_NOMINAL_START,$1);} | exper_nominal_stop {$$=make_lowl(T_EXPER_NOMINAL_STOP,$1);} | pi_name {$$=make_lowl(T_PI_NAME,$1);} | pi_email {$$=make_lowl(T_PI_EMAIL,$1);} | contact_name {$$=make_lowl(T_CONTACT_NAME,$1);} | contact_email {$$=make_lowl(T_CONTACT_EMAIL,$1);} | scheduler_name {$$=make_lowl(T_SCHEDULER_NAME,$1);} | scheduler_email {$$=make_lowl(T_SCHEDULER_EMAIL,$1);} | target_correlator {$$=make_lowl(T_TARGET_CORRELATOR,$1);} | scheduling_software {$$=make_lowl(T_SCHEDULING_SOFTWARE,$1);} | vex_file_writer {$$=make_lowl(T_VEX_FILE_WRITER,$1);} | external_ref {$$=make_lowl(T_REF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; exper_num: T_EXPER_NUM '=' value ';' {$$=$3;} ; exper_name: T_EXPER_NAME '=' T_NAME ';' {$$=make_exper_name($3,NULL);} | T_EXPER_NAME '=' T_NAME ':' T_NAME ';' {$$=make_exper_name($3,$5);} ; exper_description: T_EXPER_DESCRIPTION '=' T_NAME ';' {$$=$3;} ; exper_nominal_start: T_EXPER_NOMINAL_START '=' T_NAME ';' {$$=$3;} ; exper_nominal_stop: T_EXPER_NOMINAL_STOP '=' T_NAME ';' {$$=$3;} ; pi_name: T_PI_NAME '=' T_NAME ';' {$$=$3;} ; pi_email: T_PI_EMAIL '=' T_NAME ';' {$$=$3;} ; contact_name: T_CONTACT_NAME '=' T_NAME ';' {$$=$3;} ; contact_email: T_CONTACT_EMAIL '=' T_NAME ';' {$$=$3;} ; scheduler_name: T_SCHEDULER_NAME '=' T_NAME ';' {$$=$3;} ; scheduler_email: T_SCHEDULER_EMAIL '=' T_NAME ';' {$$=$3;} ; target_correlator: T_TARGET_CORRELATOR '=' T_NAME ';' {$$=$3;} ; scheduling_software: T_SCHEDULING_SOFTWARE '=' T_NAME ';' {$$=make_scheduling_software($3,NULL,NULL);} | T_SCHEDULING_SOFTWARE '=' T_NAME ':' T_NAME ';' {$$=make_scheduling_software($3,$5,NULL);} | T_SCHEDULING_SOFTWARE '=' T_NAME ':' T_NAME ':' T_NAME ';' {$$=make_scheduling_software($3,$5,$7);} | T_SCHEDULING_SOFTWARE '=' T_NAME ':' ':' T_NAME ';' {$$=make_scheduling_software($3,NULL,$6);} ; vex_file_writer: T_VEX_FILE_WRITER '=' T_NAME ';' {$$=make_vex_file_writer($3,NULL,NULL);} | T_VEX_FILE_WRITER '=' T_NAME ':' T_NAME ';' {$$=make_vex_file_writer($3,$5,NULL);} | T_VEX_FILE_WRITER '=' T_NAME ':' T_NAME ':' T_NAME ';' {$$=make_vex_file_writer($3,$5,$7);} | T_VEX_FILE_WRITER '=' T_NAME ':' ':' T_NAME ';' {$$=make_vex_file_writer($3,NULL,$6);} ; /* $EXTENSIONS block */ extensions_block: B_EXTENSIONS ';' extensions_defs {$$=$3;} | B_EXTENSIONS ';' {$$=NULL;} ; extensions_defs: extensions_defs extensions_defx {$$=add_list($1,$2);} | extensions_defx {$$=add_list(NULL,$1);} ; extensions_defx: extensions_def {$$=make_lowl(T_DEF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; extensions_def: T_DEF T_NAME ';' extensions_lowls T_ENDDEF ';' {$$=make_def($2,$4);} | T_DEF T_NAME ';' T_ENDDEF ';' {$$=make_def($2,NULL);} ; extensions_lowls: extensions_lowls extensions_lowl {$$=add_list($1,$2);} | extensions_lowl {$$=add_list(NULL,$1);} ; extensions_lowl: extension {$$=make_lowl(T_EXTENSION,$1);} | external_ref {$$=make_lowl(T_REF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; extension: T_EXTENSION '=' T_NAME ':' T_NAME ':' unit_more ';' {$$=make_extension($3,$5,$7);} ; /* $FREQ block */ freq_block: B_FREQ ';' freq_defs {$$=$3;} | B_FREQ ';' {$$=NULL;} ; freq_defs: freq_defs freq_defx {$$=add_list($1,$2);} | freq_defx {$$=add_list(NULL,$1);} ; freq_defx: freq_def {$$=make_lowl(T_DEF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; freq_def: T_DEF T_NAME ';' freq_lowls T_ENDDEF ';' {$$=make_def($2,$4);} | T_DEF T_NAME ';' T_ENDDEF ';' {$$=make_def($2,NULL);} ; freq_lowls: freq_lowls freq_lowl {$$=add_list($1,$2);} | freq_lowl {$$=add_list(NULL,$1);} ; freq_lowl: chan_def {$$=make_lowl(T_CHAN_DEF,$1);} | sample_rate {$$=make_lowl(T_SAMPLE_RATE,$1);} | bits_per_sample {$$=make_lowl(T_BITS_PER_SAMPLE,$1);} | switching_cycle {$$=make_lowl(T_SWITCHING_CYCLE,$1);} | external_ref {$$=make_lowl(T_REF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; chan_def: T_CHAN_DEF '=' link_or_not /* band_id */ ':' unit_value /* sky frequency */ ':' T_NAME /* net sb */ ':' unit_value /* channel BW */ ':' link_or_not /* chan ID */ ':' T_LINK ';' /* BBC ID */ {$$=make_chan_def($3,$5,$7,$9,$11,$13,NULL,NULL);} | T_CHAN_DEF '=' link_or_not /* band_id */ ':' unit_value /* sky frequency */ ':' T_NAME /* net sb */ ':' unit_value /* channel BW */ ':' link_or_not /* chan ID */ ':' T_LINK /* BBC ID */ ':' link_or_not ';' /* phase-cal ID */ {$$=make_chan_def($3,$5,$7,$9,$11,$13,$15,NULL);} | T_CHAN_DEF '=' link_or_not /* band_id */ ':' unit_value /* sky frequency */ ':' T_NAME /* net sb */ ':' unit_value /* channel BW */ ':' link_or_not /* chan ID */ ':' T_LINK /* BBC ID */ ':' link_or_not /* phase-cal ID */ /* first "switched state" could be channel name for VEX2*/ switch_states ';' /* switched states */ {$$=make_chan_def($3,$5,$7,$9,$11,$13,$15,$16);} | T_CHAN_DEF '=' link_or_not /* band_id */ ':' unit_value /* sky frequency */ ':' T_NAME /* net sb */ ':' unit_value /* channel BW */ ':' link_or_not /* chan ID */ ':' T_LINK /* BBC ID */ ':' link_or_not /* phase-cal ID */ ':' /* null channel name */ switch_states ';' /* switched states */ {$$=make_chan_def($3,$5,$7,$9,$11,$13,$15,ins_list(make_dvalue(NULL,NULL),$17));} ; switch_states: switch_states switch_state {$$=add_list($1,$2);} | switch_state {$$=add_list(NULL,$1);} ; switch_state: ':' value {$$=$2;} ; sample_rate: T_SAMPLE_RATE '=' unit_value ';' {$$=$3;} ; bits_per_sample: T_BITS_PER_SAMPLE '=' value ';' {$$=$3;} ; switching_cycle: T_SWITCHING_CYCLE '=' T_NAME ':' unit_list ';' {$$=make_switching_cycle($3,$5);} ; /* $HEAD_POS block */ head_pos_block: B_HEAD_POS ';' head_pos_defs {$$=$3;} | B_HEAD_POS ';' {$$=NULL;} ; head_pos_defs: head_pos_defs head_pos_defx {$$=add_list($1,$2);} | head_pos_defx {$$=add_list(NULL,$1);} ; head_pos_defx: head_pos_def {$$=make_lowl(T_DEF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; head_pos_def: T_DEF T_NAME ';' head_pos_lowls T_ENDDEF ';' {$$=make_def($2,$4);} | T_DEF T_NAME ';' T_ENDDEF ';' {$$=make_def($2,NULL);} ; head_pos_lowls: head_pos_lowls head_pos_lowl {$$=add_list($1,$2);} | head_pos_lowl {$$=add_list(NULL,$1);} ; head_pos_lowl: headstack_pos {$$=make_lowl(T_HEADSTACK_POS,$1);} | external_ref {$$=make_lowl(T_REF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; headstack_pos: T_HEADSTACK_POS '=' value ':' unit_list ';' {$$=make_headstack_pos($3,$5);} ; /* $IF block */ if_block: B_IF ';' if_defs {$$=$3;} | B_IF ';' {$$=NULL;} ; if_defs: if_defs if_defx {$$=add_list($1,$2);} | if_defx {$$=add_list(NULL,$1);} ; if_defx: if_def {$$=make_lowl(T_DEF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; if_def: T_DEF T_NAME ';' if_lowls T_ENDDEF ';' {$$=make_def($2,$4);} | T_DEF T_NAME ';' T_ENDDEF ';' {$$=make_def($2,NULL);} ; if_lowls: if_lowls if_lowl {$$=add_list($1,$2);} | if_lowl {$$=add_list(NULL,$1);} ; if_lowl: if_def_st {$$=make_lowl(T_IF_DEF,$1);} | receiver_name {$$=make_lowl(T_RECEIVER_NAME,$1);} | sub_lo_frequencies {$$=make_lowl(T_SUB_LO_FREQUENCIES,$1);} | sub_lo_sidebands {$$=make_lowl(T_SUB_LO_SIDEBANDS,$1);} | switched_power {$$=make_lowl(T_SWITCHED_POWER,$1);} | external_ref {$$=make_lowl(T_REF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; if_def_st: T_IF_DEF '=' T_LINK ':' T_NAME ':' T_NAME ':' unit_value ':' T_NAME ':' unit_value ':' unit_value ';' {$$=make_if_def($3,$5,$7,$9,$11,$13,$15,NULL);} | T_IF_DEF '=' T_LINK ':' T_NAME ':' T_NAME ':' unit_value ':' T_NAME ':' unit_value ':' ';' {$$=make_if_def($3,$5,$7,$9,$11,$13,NULL,NULL);} | T_IF_DEF '=' T_LINK ':' T_NAME ':' T_NAME ':' unit_value ':' T_NAME ';' {$$=make_if_def($3,$5,$7,$9,$11,NULL,NULL,NULL);} | T_IF_DEF '=' T_LINK ':' T_NAME ':' T_NAME ':' unit_value ':' T_NAME ':' ':' ';' {$$=make_if_def($3,$5,$7,$9,$11,NULL,NULL,NULL);} | T_IF_DEF '=' T_LINK ':' T_NAME ':' T_NAME ':' unit_value ':' T_NAME ':' ';' {$$=make_if_def($3,$5,$7,$9,$11,NULL,NULL,NULL);} | T_IF_DEF '=' T_LINK ':' T_NAME ':' T_NAME ':' unit_value ':' T_NAME ':' unit_value ';' {$$=make_if_def($3,$5,$7,$9,$11,$13,NULL,NULL);} | T_IF_DEF '=' T_LINK ':' ':' T_NAME ':' unit_value ':' T_NAME ':' unit_value ':' unit_value ';' {$$=make_if_def($3,NULL,$6,$8,$10,$12,$14,NULL);} | T_IF_DEF '=' T_LINK ':' ':' T_NAME ':' unit_value ':' T_NAME ':' unit_value ':' ';' {$$=make_if_def($3,NULL,$6,$8,$10,$12,NULL,NULL);} | T_IF_DEF '=' T_LINK ':' ':' T_NAME ':' unit_value ':' T_NAME ';' {$$=make_if_def($3,NULL,$6,$8,$10,NULL,NULL,NULL);} | T_IF_DEF '=' T_LINK ':' ':' T_NAME ':' unit_value ':' T_NAME ':' ':' ';' {$$=make_if_def($3,NULL,$6,$8,$10,NULL,NULL,NULL);} | T_IF_DEF '=' T_LINK ':' ':' T_NAME ':' unit_value ':' T_NAME ':' ';' {$$=make_if_def($3,NULL,$6,$8,$10,NULL,NULL,NULL);} | T_IF_DEF '=' T_LINK ':' ':' T_NAME ':' unit_value ':' T_NAME ':' unit_value ';' {$$=make_if_def($3,NULL,$6,$8,$10,$12,NULL,NULL);} | T_IF_DEF '=' T_LINK ':' ':' T_NAME ':' unit_value ':' T_NAME ':' unit_value ':' unit_value ':' unit_value ';' {$$=make_if_def($3,NULL,$6,$8,$10,$12,$14,$16);} | T_IF_DEF '=' T_LINK ':' ':' T_NAME ':' unit_value ':' T_NAME ':' ':' ':' unit_value ';' {$$=make_if_def($3,NULL,$6,$8,$10,NULL,NULL,$14);} | T_IF_DEF '=' T_LINK ':' ':' T_NAME ':' unit_value ':' T_NAME ':' unit_value ':' ':' unit_value ';' {$$=make_if_def($3,NULL,$6,$8,$10,$12,NULL,$15);} ; receiver_name: T_RECEIVER_NAME '=' T_LINK ':' T_NAME ';' {$$=make_receiver_name($3,$5);} ; sub_lo_frequencies: T_SUB_LO_FREQUENCIES '=' T_LINK ':' unit_list ';' {$$=make_sub_lo_frequencies($3,$5);} ; sub_lo_sidebands: T_SUB_LO_SIDEBANDS '=' T_LINK ':' name_list ';' {$$=make_sub_lo_sidebands($3,$5);} ; switched_power: T_SWITCHED_POWER '=' T_LINK ':' T_NAME ':' unit_value ';' {$$=make_switched_power($3,$5,$7);} | T_SWITCHED_POWER '=' T_LINK ':' T_NAME ';' {$$=make_switched_power($3,$5,NULL);} ; /* $PASS_ORDER block */ pass_order_block: B_PASS_ORDER ';' pass_order_defs {$$=$3;} | B_PASS_ORDER ';' {$$=NULL;} ; pass_order_defs: pass_order_defs pass_order_defx {$$=add_list($1,$2);} | pass_order_defx {$$=add_list(NULL,$1);} ; pass_order_defx: pass_order_def {$$=make_lowl(T_DEF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; pass_order_def: T_DEF T_NAME ';' pass_order_lowls T_ENDDEF ';' {$$=make_def($2,$4);} | T_DEF T_NAME ';' T_ENDDEF ';' {$$=make_def($2,NULL);} ; pass_order_lowls: pass_order_lowls pass_order_lowl {$$=add_list($1,$2);} | pass_order_lowl {$$=add_list(NULL,$1);} ; pass_order_lowl: pass_order {$$=make_lowl(T_PASS_ORDER,$1);} | s2_group_order {$$=make_lowl(T_S2_GROUP_ORDER,$1);} | external_ref {$$=make_lowl(T_REF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; pass_order: T_PASS_ORDER '=' name_list ';' {$$=$3;} ; s2_group_order: T_S2_GROUP_ORDER '=' value_list ';' {$$=$3;} ; /* $PHASE_CAL_DETECT block */ phase_cal_detect_block: B_PHASE_CAL_DETECT ';' phase_cal_detect_defs {$$=$3;} | B_PHASE_CAL_DETECT ';' {$$=NULL;} ; phase_cal_detect_defs: phase_cal_detect_defs phase_cal_detect_defx {$$=add_list($1,$2);} | phase_cal_detect_defx {$$=add_list(NULL,$1);} ; phase_cal_detect_defx: phase_cal_detect_def {$$=make_lowl(T_DEF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; phase_cal_detect_def: T_DEF T_NAME ';' phase_cal_detect_lowls T_ENDDEF ';' {$$=make_def($2,$4);} | T_DEF T_NAME ';' T_ENDDEF ';' {$$=make_def($2,NULL);} ; phase_cal_detect_lowls: phase_cal_detect_lowls phase_cal_detect_lowl {$$=add_list($1,$2);} | phase_cal_detect_lowl {$$=add_list(NULL,$1);} ; phase_cal_detect_lowl: phase_cal_detect {$$=make_lowl(T_PHASE_CAL_DETECT,$1);} | external_ref {$$=make_lowl(T_REF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; phase_cal_detect: T_PHASE_CAL_DETECT '=' T_LINK ':' value_list ';' {$$=make_phase_cal_detect($3,$5);} | T_PHASE_CAL_DETECT '=' T_LINK ';' {$$=make_phase_cal_detect($3,NULL);} ; /* $PROCEDURES block */ procedures_block: B_PROCEDURES ';' procedures_defs {$$=$3;} | B_PROCEDURES ';' {$$=NULL;} ; procedures_defs: procedures_defs procedures_defx {$$=add_list($1,$2);} | procedures_defx {$$=add_list(NULL,$1);} ; procedures_defx: procedures_def {$$=make_lowl(T_DEF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; procedures_def: T_DEF T_NAME ';' procedures_lowls T_ENDDEF ';' {$$=make_def($2,$4);} | T_DEF T_NAME ';' T_ENDDEF ';' {$$=make_def($2,NULL);} ; procedures_lowls: procedures_lowls procedures_lowl {$$=add_list($1,$2);} | procedures_lowl {$$=add_list(NULL,$1);} ; procedures_lowl: tape_change {$$=make_lowl(T_TAPE_CHANGE,$1);} | headstack_motion {$$=make_lowl(T_HEADSTACK_MOTION,$1);} | new_source_command {$$=make_lowl(T_NEW_SOURCE_COMMAND,$1);} | new_tape_setup {$$=make_lowl(T_NEW_TAPE_SETUP,$1);} | setup_always {$$=make_lowl(T_SETUP_ALWAYS,$1);} | parity_check {$$=make_lowl(T_PARITY_CHECK,$1);} | tape_prepass {$$=make_lowl(T_TAPE_PREPASS,$1);} | preob_cal {$$=make_lowl(T_PREOB_CAL,$1);} | midob_cal {$$=make_lowl(T_MIDOB_CAL,$1);} | postob_cal {$$=make_lowl(T_POSTOB_CAL,$1);} | procedure_name_prefix {$$=make_lowl(T_PROCEDURE_NAME_PREFIX,$1);} | external_ref {$$=make_lowl(T_REF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; tape_change: T_TAPE_CHANGE '=' unit_value ';' {$$=$3;} ; headstack_motion: T_HEADSTACK_MOTION '=' unit_value ';' {$$=$3;} ; new_source_command: T_NEW_SOURCE_COMMAND '=' unit_value ';' {$$=$3;} ; new_tape_setup: T_NEW_TAPE_SETUP '=' unit_value ';' {$$=$3;} ; setup_always: T_SETUP_ALWAYS '=' name_value ':' unit_value ';' {$$=make_setup_always($3,$5);} ; parity_check: T_PARITY_CHECK '=' name_value ':' unit_value ';' {$$=make_parity_check($3,$5);} ; tape_prepass: T_TAPE_PREPASS '=' name_value ':' unit_value ';' {$$=make_tape_prepass($3,$5);} ; preob_cal: T_PREOB_CAL '=' name_value ':' unit_value ':' name_value ';' {$$=make_preob_cal($3,$5,$7);} ; midob_cal: T_MIDOB_CAL '=' name_value ':' unit_value ':' name_value ';' {$$=make_midob_cal($3,$5,$7);} ; postob_cal: T_POSTOB_CAL '=' name_value ':' unit_value ':' name_value ';' {$$=make_postob_cal($3,$5,$7);} ; procedure_name_prefix: T_PROCEDURE_NAME_PREFIX '=' T_NAME ';' {$$=$3;} ; /* $ROLL block */ roll_block: B_ROLL ';' roll_defs {$$=$3;} | B_ROLL ';' {$$=NULL;} ; roll_defs: roll_defs roll_defx {$$=add_list($1,$2);} | roll_defx {$$=add_list(NULL,$1);} ; roll_defx: roll_def {$$=make_lowl(T_DEF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; roll_def: T_DEF T_NAME ';' roll_lowls T_ENDDEF ';' {$$=make_def($2,$4);} | T_DEF T_NAME ';' T_ENDDEF ';' {$$=make_def($2,NULL);} ; roll_lowls: roll_lowls roll_lowl {$$=add_list($1,$2);} | roll_lowl {$$=add_list(NULL,$1);} ; roll_lowl: roll_reinit_period {$$=make_lowl(T_ROLL_REINIT_PERIOD,$1);} | roll_inc_period {$$=make_lowl(T_ROLL_INC_PERIOD,$1);} | roll {$$=make_lowl(T_ROLL,$1);} | roll_def_st {$$=make_lowl(T_ROLL_DEF,$1);} | external_ref {$$=make_lowl(T_REF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; roll_reinit_period: T_ROLL_REINIT_PERIOD '=' unit_value ';' {$$=$3;} ; roll_inc_period: T_ROLL_INC_PERIOD '=' value ';' {$$=$3;} ; roll: T_ROLL '=' T_NAME ';' {$$=$3;} ; roll_def_st: T_ROLL_DEF '=' value_list ';' {$$=$3;} ; /* $SCHEDULING_PARAMS block */ scheduling_params_block: B_SCHEDULING_PARAMS ';' scheduling_params_defs {$$=$3;} | B_SCHEDULING_PARAMS ';' {$$=NULL;} ; scheduling_params_defs: scheduling_params_defs scheduling_params_defx {$$=add_list($1,$2);} | scheduling_params_defx {$$=add_list(NULL,$1);} ; scheduling_params_defx: scheduling_params_def {$$=make_lowl(T_DEF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; scheduling_params_def: T_DEF T_NAME ';' scheduling_params_lowls T_ENDDEF ';' {$$=make_def($2,$4);} | T_DEF T_NAME ';' T_ENDDEF ';' {$$=make_def($2,NULL);} ; scheduling_params_lowls: scheduling_params_lowls scheduling_params_lowl {$$=add_list($1,$2);} | scheduling_params_lowl {$$=add_list(NULL,$1);} ; scheduling_params_lowl: external_ref {$$=make_lowl(T_REF,$1);} |literal {$$=make_lowl(T_LITERAL,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; /* $SEFD block */ sefd_block: B_SEFD ';' sefd_defs {$$=$3;} | B_SEFD ';' {$$=NULL;} ; sefd_defs: sefd_defs sefd_defx {$$=add_list($1,$2);} | sefd_defx {$$=add_list(NULL,$1);} ; sefd_defx: sefd_def {$$=make_lowl(T_DEF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; sefd_def: T_DEF T_NAME ';' sefd_lowls T_ENDDEF ';' {$$=make_def($2,$4);} | T_DEF T_NAME ';' T_ENDDEF ';' {$$=make_def($2,NULL);} ; sefd_lowls: sefd_lowls sefd_lowl {$$=add_list($1,$2);} | sefd_lowl {$$=add_list(NULL,$1);} ; sefd_lowl: sefd_model {$$=make_lowl(T_SEFD_MODEL,$1);} | sefd {$$=make_lowl(T_SEFD,$1);} | external_ref {$$=make_lowl(T_REF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; sefd_model: T_SEFD_MODEL '=' T_NAME ';' {$$=$3;} ; sefd: T_SEFD '=' T_LINK ':' unit_value ':' value_list ';' {$$=make_sefd($3,$5,$7);} ; /* $SITE block */ site_block: B_SITE ';' site_defs {$$=$3;} | B_SITE ';' {$$=NULL;} ; site_defs: site_defs site_defx {$$=add_list($1,$2);} | site_defx {$$=add_list(NULL,$1);} ; site_defx: site_def {$$=make_lowl(T_DEF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; site_def: T_DEF T_NAME ';' site_lowls T_ENDDEF ';' {$$=make_def($2,$4);} | T_DEF T_NAME ';' T_ENDDEF ';' {$$=make_def($2,NULL);} ; site_lowls: site_lowls site_lowl {$$=add_list($1,$2);} | site_lowl {$$=add_list(NULL,$1);} ; site_lowl: site_type {$$=make_lowl(T_SITE_TYPE,$1);} | site_name {$$=make_lowl(T_SITE_NAME,$1);} | site_id {$$=make_lowl(T_SITE_ID,$1);} | site_position {$$=make_lowl(T_SITE_POSITION,$1);} | site_position_epoch {$$=make_lowl(T_SITE_POSITION_EPOCH,$1);} | site_position_ref {$$=make_lowl(T_SITE_POSITION_REF,$1);} | site_velocity {$$=make_lowl(T_SITE_VELOCITY,$1);} | horizon_map_az {$$=make_lowl(T_HORIZON_MAP_AZ,$1);} | horizon_map_el {$$=make_lowl(T_HORIZON_MAP_EL,$1);} | zen_atmos {$$=make_lowl(T_ZEN_ATMOS,$1);} | ocean_load_vert {$$=make_lowl(T_OCEAN_LOAD_VERT,$1);} | ocean_load_horiz {$$=make_lowl(T_OCEAN_LOAD_HORIZ,$1);} | occupation_code {$$=make_lowl(T_OCCUPATION_CODE,$1);} | inclination {$$=make_lowl(T_INCLINATION,$1);} | eccentricity {$$=make_lowl(T_ECCENTRICITY,$1);} | arg_perigee {$$=make_lowl(T_ARG_PERIGEE,$1);} | ascending_node {$$=make_lowl(T_ASCENDING_NODE,$1);} | mean_anomaly {$$=make_lowl(T_MEAN_ANOMALY,$1);} | semi_major_axis {$$=make_lowl(T_SEMI_MAJOR_AXIS,$1);} | mean_motion {$$=make_lowl(T_MEAN_MOTION,$1);} | orbit_epoch {$$=make_lowl(T_ORBIT_EPOCH,$1);} | external_ref {$$=make_lowl(T_REF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; site_type: T_SITE_TYPE '=' T_NAME ';' {$$=$3;} ; site_name: T_SITE_NAME '=' T_NAME ';' {$$=$3;} ; site_id: T_SITE_ID '=' T_NAME ';' {$$=make_site_id($3,NULL);} | T_SITE_ID '=' T_NAME ':' T_NAME ';' {$$=make_site_id($3,$5);} ; site_position: T_SITE_POSITION '=' unit_value ':' unit_value ':' unit_value ';' {$$=make_site_position($3,$5,$7);} ; site_position_epoch: T_SITE_POSITION_EPOCH '=' T_NAME ';' {$$=$3;} ; site_position_ref: T_SITE_POSITION_REF '=' T_NAME ';' {$$=$3;} ; site_velocity: T_SITE_VELOCITY '=' unit_value ':' unit_value ':' unit_value ';' {$$=make_site_velocity($3,$5,$7);} ; horizon_map_az: T_HORIZON_MAP_AZ '=' unit_list ';' {$$=$3;} ; horizon_map_el: T_HORIZON_MAP_EL '=' unit_list ';' {$$=$3;} ; zen_atmos: T_ZEN_ATMOS '=' unit_value ';' {$$=$3;} ; ocean_load_vert: T_OCEAN_LOAD_VERT '=' unit_value ':' unit_value ';' {$$=make_ocean_load_vert($3,$5);} ; ocean_load_horiz: T_OCEAN_LOAD_HORIZ '=' unit_value ':' unit_value ';' {$$=make_ocean_load_horiz($3,$5);} ; occupation_code: T_OCCUPATION_CODE '=' name_value ';' {$$=$3;} ; inclination: T_INCLINATION '=' unit_value ';' {$$=$3;} ; eccentricity: T_ECCENTRICITY '=' value ';' {$$=$3;} ; arg_perigee: T_ARG_PERIGEE '=' unit_value ';' {$$=$3;} ; ascending_node: T_ASCENDING_NODE '=' unit_value ';' {$$=$3;} ; mean_anomaly: T_MEAN_ANOMALY '=' unit_value ';' {$$=$3;} ; semi_major_axis: T_SEMI_MAJOR_AXIS '=' unit_value ';' {$$=$3;} ; mean_motion: T_MEAN_MOTION '=' value ';' {$$=$3;} ; orbit_epoch: T_ORBIT_EPOCH '=' T_NAME ';' {$$=$3;} ; /* $SOURCE block */ source_block: B_SOURCE ';' source_defs {$$=$3;} | B_SOURCE ';' {$$=NULL;} ; source_defs: source_defs source_defx {$$=add_list($1,$2);} | source_defx {$$=add_list(NULL,$1);} ; source_defx: source_def {$$=make_lowl(T_DEF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; source_def: T_DEF T_NAME ';' source_lowls T_ENDDEF ';' {$$=make_def($2,$4);} | T_DEF T_NAME ';' T_ENDDEF ';' {$$=make_def($2,NULL);} ; source_lowls: source_lowls source_lowl {$$=add_list($1,$2);} | source_lowl {$$=add_list(NULL,$1);} ; source_lowl: source_type {$$=make_lowl(T_SOURCE_TYPE,$1);} | source_name {$$=make_lowl(T_SOURCE_NAME,$1);} | iau_name {$$=make_lowl(T_IAU_NAME,$1);} | ra {$$=make_lowl(T_RA,$1);} | dec {$$=make_lowl(T_DEC,$1);} | ref_coord_frame {$$=make_lowl(T_REF_COORD_FRAME,$1);} | source_position_ref {$$=make_lowl(T_SOURCE_POSITION_REF,$1);} | source_position_epoch {$$=make_lowl(T_SOURCE_POSITION_EPOCH,$1);} | ra_rate {$$=make_lowl(T_RA_RATE,$1);} | dec_rate {$$=make_lowl(T_DEC_RATE,$1);} | velocity_wrt_lsr {$$=make_lowl(T_VELOCITY_WRT_LSR,$1);} | source_model {$$=make_lowl(T_SOURCE_MODEL,$1);} | inclination {$$=make_lowl(T_INCLINATION,$1);} | eccentricity {$$=make_lowl(T_ECCENTRICITY,$1);} | arg_perigee {$$=make_lowl(T_ARG_PERIGEE,$1);} | ascending_node {$$=make_lowl(T_ASCENDING_NODE,$1);} | mean_anomaly {$$=make_lowl(T_MEAN_ANOMALY,$1);} | semi_major_axis {$$=make_lowl(T_SEMI_MAJOR_AXIS,$1);} | mean_motion {$$=make_lowl(T_MEAN_MOTION,$1);} | orbit_epoch {$$=make_lowl(T_ORBIT_EPOCH,$1);} | external_ref {$$=make_lowl(T_REF,$1);} | bsp_file_name {$$=make_lowl(T_BSP_FILE_NAME,$1);} | bsp_object_id {$$=make_lowl(T_BSP_OBJECT_ID,$1);} | tle0 {$$=make_lowl(T_TLE0,$1);} | tle1 {$$=make_lowl(T_TLE1,$1);} | tle2 {$$=make_lowl(T_TLE2,$1);} | datum {$$=make_lowl(T_DATUM,$1);} | vector {$$=make_lowl(T_VECTOR,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; source_type: T_SOURCE_TYPE '=' T_NAME ';' {$$=make_source_type($3,NULL,NULL);} | T_SOURCE_TYPE '=' T_NAME ':' T_NAME ';' {$$=make_source_type($3,$5,NULL);} | T_SOURCE_TYPE '=' T_NAME ':' name_or_not ':' T_NAME ';' {$$=make_source_type($3,$5,$7);} ; source_name: T_SOURCE_NAME '=' T_NAME ';' {$$=$3;} ; iau_name: T_IAU_NAME '=' T_NAME ';' {$$=$3;} ; ra: T_RA '=' T_NAME ';' {$$=$3;} ; dec: T_DEC '=' T_ANGLE ';' {$$=$3;} ; ref_coord_frame: T_REF_COORD_FRAME '=' T_NAME ';' {$$=$3;} ; source_position_ref: T_SOURCE_POSITION_REF '=' T_NAME ';' {$$=$3;} ; source_position_epoch: T_SOURCE_POSITION_EPOCH '=' T_NAME ';' {$$=$3;} ; ra_rate: T_RA_RATE '=' unit_value ';' {$$=$3;} ; dec_rate: T_DEC_RATE '=' unit_value ';' {$$=$3;} ; velocity_wrt_lsr: T_VELOCITY_WRT_LSR '=' unit_value ';' {$$=$3;} ; source_model: T_SOURCE_MODEL '=' value ':' T_LINK ':' unit_value ':' unit_value ':' value ':' unit_value ':' unit_value ':' unit_value ';' {$$=make_source_model($3,$5,$7,$9,$11,$13,$15,$17);} ; bsp_file_name: T_BSP_FILE_NAME '=' T_NAME ';' {$$=$3;} ; bsp_object_id: T_BSP_OBJECT_ID '=' T_NAME ';' {$$=$3;} ; tle0: T_TLE0 '=' T_NAME ';' {$$=$3;} ; tle1: T_TLE1 '=' T_NAME ';' {$$=$3;} ; tle2: T_TLE2 '=' T_NAME ';' {$$=$3;} ; datum: T_DATUM '=' name_value ':' name_value ':' T_ANGLE ';' {$$=make_datum($3,$5,$7,NULL,NULL);} | T_DATUM '=' name_value ':' name_value ':' T_ANGLE ':' unit_value ';' {$$=make_datum($3,$5,$7,$9,NULL);} | T_DATUM '=' name_value ':' name_value ':' T_ANGLE ':' unit_value2 ':' unit_value ';' {$$=make_datum($3,$5,$7,$9,$11);} ; vector: T_VECTOR '=' name_value ':' unit_value ':' unit_value ':' unit_value ';' {$$=make_vector($3,$5,$7,$9,NULL,NULL,NULL);} | T_VECTOR '=' name_value ':' unit_value ':' unit_value ':' unit_value ':' unit_value ';' {$$=make_vector($3,$5,$7,$9,$11,NULL,NULL);} | T_VECTOR '=' name_value ':' unit_value ':' unit_value ':' unit_value ':' unit_value2 ':' unit_value ';' {$$=make_vector($3,$5,$7,$9,$11,$13,NULL);} | T_VECTOR '=' name_value ':' unit_value ':' unit_value ':' unit_value ':' unit_value2 ':' unit_value2 ':' unit_value ';' {$$=make_vector($3,$5,$7,$9,$11,$13,$15);} ; /* $TAPELOG_OBS block */ tapelog_obs_block: B_TAPELOG_OBS ';' tapelog_obs_defs {$$=$3;} | B_TAPELOG_OBS ';' {$$=NULL;} ; tapelog_obs_defs: tapelog_obs_defs tapelog_obs_defx {$$=add_list($1,$2);} | tapelog_obs_defx {$$=add_list(NULL,$1);} ; tapelog_obs_defx: tapelog_obs_def {$$=make_lowl(T_DEF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; tapelog_obs_def: T_DEF T_NAME ';' tapelog_obs_lowls T_ENDDEF ';' {$$=make_def($2,$4);} | T_DEF T_NAME ';' T_ENDDEF ';' {$$=make_def($2,NULL);} ; tapelog_obs_lowls: tapelog_obs_lowls tapelog_obs_lowl {$$=add_list($1,$2);} | tapelog_obs_lowl {$$=add_list(NULL,$1);} ; tapelog_obs_lowl: vsn {$$=make_lowl(T_VSN,$1);} | external_ref {$$=make_lowl(T_REF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; vsn: T_VSN '=' value ':' T_NAME ':' T_NAME ':' T_NAME ';' {$$=make_vsn($3,$5,$7,$9,NULL);} | T_VSN '=' value ':' T_NAME ':' T_NAME ':' T_NAME ':' link_list';' {$$=make_vsn($3,$5,$7,$9,$11);} ; /* $TRACKS */ tracks_block: B_TRACKS ';' tracks_defs {$$=$3;} | B_TRACKS ';' {$$=NULL;} ; tracks_defs: tracks_defs tracks_defx {$$=add_list($1,$2);} | tracks_defx {$$=add_list(NULL,$1);} ; tracks_defx: tracks_def {$$=make_lowl(T_DEF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; tracks_def: T_DEF T_NAME ';' tracks_lowls T_ENDDEF ';' {$$=make_def($2,$4);} | T_DEF T_NAME ';' T_ENDDEF ';' {$$=make_def($2,NULL);} ; tracks_lowls: tracks_lowls tracks_lowl {$$=add_list($1,$2);} | tracks_lowl {$$=add_list(NULL,$1);} ; tracks_lowl: fanin_def {$$=make_lowl(T_FANIN_DEF,$1);} | fanout_def {$$=make_lowl(T_FANOUT_DEF,$1);} | track_frame_format {$$=make_lowl(T_TRACK_FRAME_FORMAT,$1);} | sample_rate {$$=make_lowl(T_SAMPLE_RATE,$1);} | data_modulation {$$=make_lowl(T_DATA_MODULATION,$1);} | vlba_frmtr_sys_trk {$$=make_lowl(T_VLBA_FRMTR_SYS_TRK,$1);} | vlba_trnsprt_sys_trk {$$=make_lowl(T_VLBA_TRNSPRT_SYS_TRK,$1);} | s2_recording_mode {$$=make_lowl(T_S2_RECORDING_MODE,$1);} | s2_data_source {$$=make_lowl(T_S2_DATA_SOURCE,$1);} | external_ref {$$=make_lowl(T_REF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; fanin_def: T_FANIN_DEF '=' T_NAME ':' value ':' value ':' bit_stream_list ';' {$$=make_fanin_def($3,$5,$7,$9);} ; fanout_def: T_FANOUT_DEF '=' T_NAME ':' bit_stream_list ':' value ':' value_list ';' {$$=make_fanout_def($3,$5,$7,$9);} | T_FANOUT_DEF '=' ':' bit_stream_list ':' value ':' value_list ';' {$$=make_fanout_def(NULL,$4,$6,$8);} ; track_frame_format: T_TRACK_FRAME_FORMAT '=' T_NAME ';' {$$=$3;} ; data_modulation: T_DATA_MODULATION '=' T_NAME ';' {$$=$3;} ; vlba_frmtr_sys_trk: T_VLBA_FRMTR_SYS_TRK '=' value ':' T_NAME ':' value ':' value ';' {$$=make_vlba_frmtr_sys_trk($3,$5,$7,$9);} | T_VLBA_FRMTR_SYS_TRK '=' value ':' T_NAME ':' value ';' {$$=make_vlba_frmtr_sys_trk($3,$5,$7,NULL);} ; vlba_trnsprt_sys_trk: T_VLBA_TRNSPRT_SYS_TRK '=' value ':' value ';' {$$=add_list(add_list(NULL,$3),$5);} ; s2_recording_mode: T_S2_RECORDING_MODE '=' T_NAME ';' {$$=$3;} ; s2_data_source: T_S2_DATA_SOURCE '=' T_NAME ':' T_LINK ':' T_LINK ';' {$$=make_s2_data_source($3,$5,$7);} | T_S2_DATA_SOURCE '=' T_NAME ';' {$$=make_s2_data_source($3,NULL,NULL);} ; bit_stream_list: bit_stream_list ':' T_LINK ':' T_NAME {$$=add_list(add_list($1,$3),$5);} | T_LINK ':' T_NAME {$$=add_list(add_list(NULL,$1),$3);} ; /* $THREADS */ threads_block: B_THREADS ';' threads_defs {$$=$3;} | B_THREADS ';' {$$=NULL;} ; threads_defs: threads_defs threads_defx {$$=add_list($1,$2);} | threads_defx {$$=add_list(NULL,$1);} ; threads_defx: threads_def {$$=make_lowl(T_DEF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; threads_def: T_DEF T_NAME ';' threads_lowls T_ENDDEF ';' {$$=make_def($2,$4);} | T_DEF T_NAME ';' T_ENDDEF ';' {$$=make_def($2,NULL);} ; threads_lowls: threads_lowls threads_lowl {$$=add_list($1,$2);} | threads_lowl {$$=add_list(NULL,$1);} ; threads_lowl: format_def {$$=make_lowl(T_FORMAT_DEF,$1);} | thread_def {$$=make_lowl(T_THREAD_DEF,$1);} | channel_def {$$=make_lowl(T_CHANNEL_DEF,$1);} | external_ref {$$=make_lowl(T_REF,$1);} | T_COMMENT {$$=make_lowl(T_COMMENT,$1);} | T_COMMENT_TRAILING {$$=make_lowl(T_COMMENT_TRAILING,$1);} ; format_def: T_FORMAT_DEF '=' T_NAME ':' optional_name ':' optional_value ';' {$$=make_format_def($3, $5, $7);} | T_FORMAT_DEF '=' T_NAME ':' optional_name ';' {$$=make_format_def($3, $5, NULL);} | T_FORMAT_DEF '=' T_NAME ';' {$$=make_format_def($3, NULL, NULL);} ; /* thrd backend recorder rate nchan bits/sample */ thread_def: T_THREAD_DEF '=' value ':' value ':' value ':' value ':' value ':' value ':' /* format extended bytesperpacket */ optional_name ':' optional_name ':' optional_value ';' {$$=make_thread_def($3, $5, $7, $9, $11, $13, $15, $17, $19);} | T_THREAD_DEF '=' value ':' value ':' value ':' value ':' value ':' value ':' optional_name ':' optional_name ';' {$$=make_thread_def($3, $5, $7, $9, $11, $13, $15, $17, NULL);} | T_THREAD_DEF '=' value ':' value ':' value ':' value ':' value ':' value ':' optional_name ';' {$$=make_thread_def($3, $5, $7, $9, $11, $13, $15, NULL, NULL);} | T_THREAD_DEF '=' value ':' value ':' value ':' value ':' value ':' value ';' {$$=make_thread_def($3, $5, $7, $9, $11, $13, NULL, NULL, NULL);} ; channel_def: T_CHANNEL_DEF '=' T_LINK /*T_NAME*/ ':' value ':' value ';' {$$=make_channel_def($3, $5, $7);} ; /* utility rules */ optional_name : /* empty */ {$$=NULL;} | T_NAME {$$=$1;} ; optional_value : /* empty */ {$$=NULL;} | value {$$=$1;} ; external_ref: T_REF T_NAME ':' primitive '=' T_NAME ';' {$$=make_external($2,$4,$6);} ; literal: T_LITERAL ';' {$$=$1;} ; unit_list: unit_value ':' unit_more {$$=ins_list($1,$3);} | unit_value {$$=add_list(NULL,$1);} ; unit_more: unit_more ':' unit_option {$$=add_list($1,$3);} | unit_option {$$=add_list(NULL,$1);} ; unit_option: unit_value {$$=$1;} | value ; unit_value: T_NAME T_NAME {$$=make_dvalue($1,$2);} ; name_list: name_list ':' name_value {$$=add_list($1,$3);} | name_value {$$=add_list(NULL,$1);} ; name_value: T_NAME ; value_list: value_list ':' value {$$=add_list($1,$3);} | value {$$=add_list(NULL,$1);} ; value: T_NAME {$$=make_dvalue($1,NULL);} ; value2: /* empty */ {$$=NULL;} | T_NAME {$$=make_dvalue($1,NULL);} ; unit_value2: /* empty */ {$$=NULL;} | T_NAME T_NAME {$$=make_dvalue($1,$2);} ; name_or_not: /* empty */ {$$=NULL;} | T_NAME {$$=$1;} ; link_list: link_list ':' T_LINK {$$=add_list($1,$3);} | T_LINK {$$=add_list(NULL,$1);} ; link_or_not: /* empty */ {$$=NULL;} | T_LINK {$$=$1;} ; empty_value: /* empty */ {$$=NULL;} ; empty_name: /* empty */ {$$=NULL;} ; %% void yyerror(s) char const *s; { fprintf(stderr,"%s at line %d\n",s,lines); exit(1); }