config		::= /* Empty */
		| statements
		;
statements	::= statement
		| statements statement
		;
statement	::= parse_statement
		| trace_statement
		| option_order option_statement
		| interface_order interface_statement
		| define_order define_statement
		| proto_order proto_statement
		| route_order route_statement
		| control_order control_statement
		| error L_EOS
		| L_EOS
		;
/*  */
define_statement
		::= 
		...
@BEGIN:	PROTO_IDRP
                | T_RDI osi_rdi L_EOS
                | osi_tagged_address L_EOS
@END:	PROTO_IDRP
@BEGIN:	PROTO_ISO
		| T_ISO T_MARTIANS
			'{' martian_list_iso '}' L_EOS
@END:	PROTO_ISO
		...
		;
@BEGIN:	PROTO_ISO
martian_list_iso ::= /* Empty */
		| martian_list_iso martian_iso martian_option L_EOS
		| martian_list_iso error L_EOS
		;
martian_iso	::= host_mask_iso
		| network_mask_flags_iso
		| default_mask_iso
		;
@END:	PROTO_ISO
		
proto_statement	::= 
		...
@BEGIN:	PROTO_IDRP
    		| idrp_statement L_EOS
@END:	PROTO_IDRP
		...
		;
/*  */
@BEGIN:	PROTO_IDRP
idrp_statement ::= T_IDRP
        onoff_option idrp_group 
	;
idrp_group              ::= /* empty */
                        | '{' idrp_group_stmts '}'
                        ;
idrp_group_stmts        ::= /* empty */
                        | idrp_group_stmts idrp_group_stmt L_EOS
                        | idrp_group_stmts error L_EOS
                        ;
idrp_group_stmt ::= T_TRACEOPTIONS trace_file_option trace_control_option idrp_trace_options_none
	| T_LOCALNODE
       '{' idrp_local_node_stmts '}'
        | T_GROUP
          idrp_group_options '{' idrp_peer_stmts '}'
        | T_OSILOCAL
          '{' idrp_local_routes '}'
        ;
idrp_peer_stmts         ::= /* empty */
                        | idrp_peer_stmts idrp_peer_stmt L_EOS
                        | idrp_peer_stmts error L_EOS
                        ;
idrp_local_node_stmts   ::= /* empty */
                        | idrp_local_node_stmts idrp_local_node_stmt L_EOS
                        | idrp_local_node_stmts error L_EOS
                        ;
idrp_local_node_stmt    ::= T_PROTOSUPPORT idrp_proto_supp
			| idrp_sock_support 
			| idrp_auth
			| idrp_authcode
			| T_CAPACITY idrp_capacity_value
			| idrp_hold
			| idrp_snpa_option
			| T_EXPENSE idrp_expense_value
			| T_MAXCPU L_NUMBER
			| idrp_max_pdu
			| T_RIBCHECK L_NUMBER
			| T_MINADVRD L_NUMBER
			| T_MULTIEXIT onoff_option
			| T_PRIORITY idrp_priority_value
			| T_RDLRE idrp_rdlre_value
			| T_TRANSITDELAY idrp_transit_delay_value
			| idrp_rexmit 
			| T_ROUTESERVER onoff_option
			| T_VERSION L_NUMBER
/* idrp peer variables that can be set for local peer */
			| idrp_close_time
			| idrp_minadv
			| idrp_max_outpdu
/* idrp for ip variables */
			| T_ASRDI osi_address	
/* special MERIT function switches */
			| idrp_closestay
			| T_EXTINFO 
 			'{' idrp_ps_attribute_entries '}'
			| T_LOCALINFO
 			'{' idrp_ps_attribute_entries '}'
                        | T_NET_AUTO_NLRI onoff_option
                        | T_EXPAND_NEXT_HOP onoff_option
			;	
/* this _was_ idrp_sock_options (i.e., plural form) */
idrp_sock_support::= T_PROTOSOCK idrp_sock_option
		;
/* these clauses shared by local node and peers */
idrp_auth		::= T_AUTHTYPE idrp_auth_type
			;	
idrp_authcode		::= T_AUTHCODE L_HEXSTRING
			;	
idrp_auth_type::= T_TEST
		| T_CLEAR
		| T_CRYPT
		| T_SIMPLE
	;
idrp_close_time		::= T_CLOSEWAIT L_NUMBER 
			;
idrp_closestay		::= T_CLOSESTAY L_NUMBER
			;	
idrp_hold	::= T_HOLDTIME idrp_hold_time_value
		;
idrp_listenopen		::= T_LISTENOPEN onoff_option
			;
idrp_max_output		::= T_OUTPDUS L_NUMBER
			;
idrp_max_pdu	::= T_MAXPDUSIZE L_NUMBER
		;	
idrp_max_outpdu	::= T_OUTPDUS L_NUMBER
                        ;
idrp_minadv 	::= T_MINADV idrp_minadv_value
	;
idrp_minadv_value	::= L_NUMBER
	;
idrp_rexmit     ::= T_REXMIT L_NUMBER
			;
/* begin peer clauses */
idrp_peer_stmt          ::= T_NEIGHBOR
        onoff_option osi_tagged_address host T_RDI osi_address idrp_options
        ;
idrp_options::= /* empty */
	| idrp_options idrp_option
	| idrp_options error
	;
idrp_option::= idrp_intf_option
	| idrp_proto_option
	| idrp_peer_option
	;
idrp_local_routes::= /* empty */
        | idrp_local_routes idrp_local_route L_EOS  
        | idrp_local_routes error L_EOS  
        ;
idrp_local_route::= osi_prefix osi_prefix 
	| osi_prefix osi_prefix idrp_atts_clause
	| osi_prefix osi_prefix T_EXTERIOR
	;
/* idrp route parsing - for both export and local route parsing
 * - routines are used in both
 */
/* gated parsing routines */
/* interior routes that idrp will translate to IDRP options
 * -all implies any that idrp is ready to do
 */
idrp_interior_export	::= T_ALL
@BEGIN:	PROTO_ISIS
			| T_ISIS
@END:	PROTO_ISIS
			| T_ALL
			; 	
@BEGIN:	PROTO_TODO
/* here where we put all the idrp attributes including the QOS */
idrp_attribute_list	::= T_IDRP_ATTS
			     '{' idrp_attribute_entries '}'
				;
idrp_attribute_entries	::= idrp_attribute_entry 
			| idrp_attribute_entries idrp_attribute_entry
			; 
idrp_attribute_entry	::= idrp_route_options
			| idrp_pref_calc
			| idrp_QOS_options
@BEGIN:	PROTO_RDPATHS
			| idrp_dist_options
@END:	PROTO_RDPATHS
			;
idrp_route_options	::= idrp_route_option L_EOS  
			| idrp_route_options idrp_route_option L_EOS
			;
idrp_route_option	::= idrp_snpa_rt_option
			| T_ROUTESERVER T_ON
			| T_ROUTESERVER T_OFF
			| T_ROUTESERVER  
			| osi_tagged_address
			| T_GATEWAY host
			| T_INTERFACE host 
			| idrp_multi
			; 
idrp_multi_exit_topeers	::= idrp_multi_exit_topeer
			| idrp_multi_exit_topeers idrp_multi_exit_topeer 
			;
idrp_multi_exit_topeer	::= L_NUMBER 
			;
idrp_pref_calc		::= T_HOPCOUNT L_NUMBER L_EOS
			;
@BEGIN:	PROTO_RDPATHS
idrp_dist_options	::= idrp_dist_option
			| idrp_dist_options idrp_dist_option
			;
idrp_dist_option	::= T_PROHIBIT_DIST idrp_dist_list L_EOS
                        | T_ALLOW_DIST idrp_dist_list L_EOS
			;
idrp_dist_list		::= idrp_dist_list idrp_dist_rdi 
			| idrp_dist_rdi 
			;
/* TODO::=  HUH? */
idrp_dist_rdi		::= osi_prefix				
	;	
@END:	PROTO_RDPATHS
idrp_QOS_options	::= idrp_QOS_option L_EOS
			| idrp_QOS_options idrp_QOS_option L_EOS
idrp_QOS_option		::= T_TRANSITDELAY idrp_transit_delay_value
			| T_RDLRE idrp_rdlre_value
			| T_EXPENSE idrp_expense_value
			| T_PRIORITY idrp_priority_value
			| T_CAPACITY idrp_capacity_value
			;
@END:	PROTO_TODO
idrp_transit_delay_value ::= L_NUMBER	
	;
idrp_expense_value ::= L_NUMBER
	;
idrp_rdlre_value ::= L_NUMBER
	;
idrp_priority_value::= L_NUMBER
	;
idrp_capacity_value::= L_NUMBER
	;
idrp_multiexit_value::= L_NUMBER
	;
idrp_hold_time_value::= L_NUMBER
	;
idrp_intf_options	::= idrp_intf_option
			| idrp_snpa_option
			| idrp_intf_option idrp_snpa_option
			| idrp_snpa_option idrp_intf_option
			;
idrp_snpa_option	::= T_SNPA 
			  idrp_snpa 
			;
idrp_snpa_rt_option	::= T_SNPA T_ISO
			  idrp_snpas
			| T_SNPA T_IP
			  idrp_snpas
			| T_SNPA
			  idrp_snpas
			;
idrp_intf_option        ::=  T_INTERFACE host
			| T_INTERFACE osi_tagged_address
			| T_INTERFACE host osi_tagged_address
			| T_INTERFACE osi_tagged_address host
                        ;
idrp_snpas		::= idrp_snpa
			| idrp_snpas idrp_snpa 
			;
idrp_snpa		::= L_HEXSTRING 
			;
idrp_group_options      ::= idrp_group_option
                        | idrp_group_options idrp_group_option
                        ;
idrp_group_option       ::= T_RDI osi_rdi
                        | T_INTERNAL
                        | T_EXTERNAL
                        ;
/*
idrp_proto_options	::= idrp_proto_option
			| idrp_proto_options idrp_proto_option
			;
*/
idrp_proto_option ::=  T_PROTOSUPPORT idrp_proto_supp
	| T_SOCKSUPPORT idrp_sock_support 
	| idrp_sock_support
	;
/*
idrp_sock_options	::= idrp_sock_options idrp_sock_option
			| idrp_sock_option
			;
*/
idrp_sock_option	::=  T_IP
			| T_UDP
			|  T_ISO		 	 
			| T_IDRP
			;
idrp_proto_supp		::= T_ISO 
			| T_IP
			| T_IP T_ISO
			| T_ISO T_IP
			;
idrp_peer_options       ::= idrp_peer_options idrp_peer_option
                        | idrp_peer_option
                        ;
idrp_peer_option        ::= T_TRACEOPTIONS trace_file_option trace_control_option idrp_trace_options_none
			| idrp_auth
			| idrp_authcode
			| idrp_close_time
			| idrp_max_outpdu
			| idrp_hold
			| idrp_minadv
			| idrp_listenopen
			| idrp_rexmit
			| idrp_closestay
			| T_MULTIEXIT L_NUMBER
			| T_RIB_REFRESH onoff_option
			| T_RIB_REFRESH
			;
/*
 * this formerly had 'osi_nsap' as an option, which caused 14 reduce/reduce
 * conflicts between the osi_nsap and host productions  -- sjr
 */
osi_tagged_address    ::= osi_address_name osi_nsap
        ;
osi_address     ::= addr_iso
		| osi_hex
                ;
osi_nsap        ::= addr_iso
		| osi_hex
                ;
osi_rdi         ::= addr_iso
		| osi_hex
		;
osi_rdi_or_any  ::= osi_rdi
		| T_ANY
                ;
osi_prefix      ::= addr_iso
		| osi_hex
                ;
osi_address_name::= T_NET
		| T_NSAP
                ;
idrp_prop_init ::= T_IDRP
		;
idrp_trace_options_none
		::= T_NONE
		| idrp_trace_options
		| idrp_trace_options T_EXCEPT idrp_trace_options
    		;
idrp_trace_options
		::= idrp_trace_option
		| idrp_trace_options idrp_trace_option
		;
idrp_trace_option ::= trace_option
		| T_PHASE1	
		| T_MINADVTIMER	
		| T_PHASE3	
		| T_ROUTE_TIES	
		| T_IDRP_DEBUG	
		| T_IDRP
		;
@BEGIN:	PROTO_TODO
idrp_trace_option_index
		::= T_PACKETS 
/* TODO
		| T_OPEN
		| T_UPDATE
		| T_KEEPALIVE
		| T_PHASE1
*/
		;
@END:	PROTO_TODO
@END:	PROTO_IDRP
/*  */
route_statement ::= T_STATIC
		'{' route_stmts '}'
		;
route_stmts	::= route_stmt L_EOS
		| route_stmts route_stmt L_EOS
		| error L_EOS
		;
route_stmt	::= 
		...
@BEGIN:	PROTO_ISO
		| host_mask_iso
    		| network_mask_iso
		| T_ISO T_DEFAULT
@END:	PROTO_ISO
		...
    		;
/*  */
control_statement
		::= 
		...
@BEGIN:	PROTO_IDRP
	| T_IMPORT T_PROTO control_idrp 
	  T_RDI osi_rdi_or_any idrp_import_optional_info idrp_import_option L_EOS
	| T_IMPORT T_PROTO control_idrp 
	  T_RDPATH rdpath_spec idrp_import_optional_info idrp_import_option L_EOS
@END:	PROTO_IDRP
		...
@BEGIN:	PROTO_IDRP
	| T_EXPORT T_PROTO control_idrp 
	  T_RDI osi_rdi_or_any prop_source_option_idrp L_EOS
@END:	PROTO_IDRP
		...
@BEGIN:	PROTO_ISO
		| T_AGGREGATE aggregate_dest_iso preference_option aggregate_options '{' aggregate_list_iso '}' L_EOS
		| T_GENERATE aggregate_dest_iso preference_option '{' aggregate_list_iso '}' L_EOS
@END:	PROTO_ISO
		;	
/*  */
/* Support for aggregate clauses */
@BEGIN:	PROTO_ISO
aggregate_dest_iso
		::= T_ISO network_mask_iso
		| T_ISO default_mask_iso
		;
aggregate_list_iso
		::= aggregate_proto_iso
		| aggregate_list_iso aggregate_proto_iso
		| aggregate_list_iso error L_EOS
		;
aggregate_proto_iso
		::= T_PROTO aggregate_protos_iso import_option_iso L_EOS
		;
aggregate_protos_iso
		::= T_ALL
		| T_STATIC
		| T_KERNEL
		| T_AGGREGATE
		...
@BEGIN:	PROTO_IDRP
		| T_IDRP
@END:	PROTO_IDRP
		...
		;
@END:	PROTO_ISO
/*  */
/* Support for import clauses */
control_exterior	::= proto_exterior
		;
@BEGIN:	PROTO_IDRP
control_idrp ::= T_IDRP
		;
@END:	PROTO_IDRP
import_interior ::= proto_interior
		;
@BEGIN:	PROTO_IDRP
/* 
	N.B.::=  
		This architecture will allow for multiple specification of
		each of the options; you should either::=
			- issue a warning and only use the last one specified, or
			- issue an error and exit when a duplicate field tag is
			  found.
*/
idrp_local_intf_test ::= T_LOCAL_INTERFACE host 
	/* TODO::=  the following only uses NET for now; should be idrp_snpa! */
	| T_LOCAL_NET osi_address
	;
/*
 * "$$" should contain the idrp_policy_atts_clause, if any;
 * the idrp_atts_clause is stored in the global p_idrp_ps_atts.
 */
idrp_import_optional_info ::= /* Empty */
	| idrp_local_intf_test 
	| idrp_policy_atts_clause
	| idrp_atts_clause
	| idrp_local_intf_test idrp_policy_atts_clause
	| idrp_local_intf_test idrp_atts_clause
	| idrp_policy_atts_clause idrp_atts_clause
	| idrp_atts_clause idrp_policy_atts_clause
	| idrp_local_intf_test idrp_policy_atts_clause idrp_atts_clause
	| idrp_local_intf_test idrp_atts_clause idrp_policy_atts_clause
	;
idrp_export_optional_info ::= /* Empty */
	| idrp_policy_atts_clause
	| idrp_atts_clause
	| idrp_policy_atts_clause idrp_atts_clause
	| idrp_atts_clause idrp_policy_atts_clause
	;
idrp_policy_atts_clause::= T_IDRP_PS_POLICY_ATTS 
	'{' idrp_ps_policy_attribute_entries '}'
	;
idrp_atts_clause::= T_IDRP_PS_ATTS 
	'{' idrp_ps_attribute_entries '}'
	;
idrp_ps_policy_attribute_entries::= idrp_ps_policy_attribute_entry
	| idrp_ps_policy_attribute_entries idrp_ps_policy_attribute_entry
	; 
idrp_ps_attribute_entries::= idrp_ps_attribute_entry 
	| idrp_ps_attribute_entries idrp_ps_attribute_entry
	; 
idrp_ps_policy_attribute_entry::= idrp_ps_policy_route_option L_EOS
	| idrp_ps_policy_hopcount L_EOS
	| idrp_ps_policy_nexthop L_EOS
	| idrp_ps_policy_QOS_option L_EOS
/* TODO @BEGIN:	PROTO_RDPATHS */
	| idrp_ps_policy_dist_option L_EOS
/* @END:	PROTO_RDPATHS */
	;
idrp_ps_attribute_entry::= idrp_ps_route_option L_EOS
	| idrp_ps_pref_calc L_EOS
	| idrp_ps_QOS_option L_EOS
/* SJR TODO @BEGIN:	PROTO_RDPATHS
*/
	| idrp_ps_dist_option L_EOS
/* SJR TODO @END:	PROTO_RDPATHS
*/
	;
idrp_ps_policy_route_option::= T_ROUTESERVER null_or_restrict
	| T_EXTINFO null_or_restrict
	| T_HIERARCHICAL_REC null_or_restrict
	| T_MULTIEXIT null_or_restrict
        | T_MULTIEXIT number_compare_op idrp_multiexit_value
	; 
idrp_ps_policy_nexthop::= T_NET osi_address
	/* TODO -- just one SNPA, now--sjr */
	| T_NET osi_address T_SNPA idrp_snpa
	| T_GATEWAY host
	| T_INTERFACE host
	;
idrp_ps_route_option::= T_ROUTESERVER onoff_option
	| T_EXTINFO
	| T_HIERARCHICAL_REC
	| T_MULTIEXIT idrp_multiexit_value
/* TODO--it would make sense to use something akin to::=
 * "NEXTHOP use-me;" for 7.12.4 a) 1 or b) 1
 * "NEXTHOP none;" for 7.12.4 a) 2 or b) 2
 * This has implications for SNPAs, etc.
 *
 * SJR
 */
	; 
idrp_ps_policy_hopcount ::= T_HOPCOUNT number_compare_op idrp_rd_hopcount_value
	;
idrp_ps_pref_calc ::= T_HOPCOUNT_OFFSET idrp_preference
	;
idrp_rd_hopcount_value ::= L_NUMBER
	;
number_compare_op ::= /* empty */
	| T_LT
	| T_LE
	| T_EQ
	| T_NE
	| T_GE
	| T_GT
	;
/* TODO::=  sort as they are input */
/* TODO SJR take care of this when PROTO_RDPATHS is not limping @BEGIN:	PROTO_RDPATHS */
idrp_ps_dist_option::= T_PROHIBIT_DIST '{' idrp_ps_dist_list '}'
	| T_ALLOW_DIST '{' idrp_ps_dist_list '}'
	;
idrp_ps_dist_list::= idrp_ps_dist_list idrp_ps_dist_rdi 
	| idrp_ps_dist_rdi 
	;
idrp_ps_dist_rdi::= osi_rdi				
	;	
/* TODO SJR take care of this when PROTO_RDPATHS is not limping @END:	PROTO_RDPATHS */
/*TODO--wrap in RDPATH */
idrp_ps_policy_dist_option::= T_DIST_LIST_INCL '{' idrp_ps_dist_list '}'
	| T_DIST_LIST_EXCL '{' idrp_ps_dist_list '}'
	;
idrp_ps_policy_QOS_option ::= T_TRANSITDELAY null_or_restrict 
	| T_TRANSITDELAY number_compare_op idrp_transit_delay_value
	| T_RDLRE null_or_restrict
	| T_RDLRE number_compare_op idrp_rdlre_value
	| T_EXPENSE null_or_restrict
	| T_EXPENSE number_compare_op idrp_expense_value
	| T_PRIORITY null_or_restrict
	| T_PRIORITY number_compare_op idrp_priority_value
	| T_CAPACITY null_or_restrict
	| T_CAPACITY number_compare_op idrp_capacity_value
	;
idrp_ps_QOS_option::= T_TRANSITDELAY idrp_transit_delay_value
	| T_RDLRE idrp_rdlre_value
	| T_EXPENSE idrp_expense_value
	| T_PRIORITY idrp_priority_value
	| T_CAPACITY idrp_capacity_value
	;
idrp_ps_snpa_rt_option	::= T_SNPA
			  idrp_snpas
			;
/* TODO--@BEGIN:	PROTO_RDPATHS */
rdpath_prop_init::= idrp_prop_init
rdpath_spec::= '/' rdpath_parts rdpath_any_or_null '/' rdpath_flag
	; 
rdpath_parts::= rdpath_part
	| rdpath_parts rdpath_part
	;
rdpath_part::= rdpath_special_part rdpath_real_part
	| rdpath_real_part
	;
rdpath_special_part::= '.'
	| rdpath_any 
	;
rdpath_any::= '.' '*'
	;
rdpath_any_or_null::= /* empty */
	| rdpath_any
	;
rdpath_real_part::= policy_rdpath_rdi
	| '[' rdpath_set ']' 
	| '(' rdpath_or_list ')'
	;
rdpath_set::= policy_rdpath_rdi
	| rdpath_set policy_rdpath_rdi
	;
rdpath_or_list::= policy_rdpath_rdi
	| rdpath_or_list '|' policy_rdpath_rdi
	;
policy_rdpath_rdi::= osi_rdi
	;
rdpath_flag::= /* Empty */
	| T_EXACT
	| T_SUBSET
	;
/* TODO--@END:	PROTO_RDPATHS */
idrp_gateway_list::= L_NUMBER /* TODO! */
		;
idrp_interface_list::= L_NUMBER /* TODO! */
		;
idrp_parse_import_list::=  /* Empty */
 		| idrp_parse_import_list idrp_import_listen L_EOS
 		| idrp_parse_import_list error L_EOS
 		;
idrp_import_listen::=
 	idrp_dest_mask idrp_preference_restrict_option
	;
idrp_dest_mask::= osi_dest_mask
	| T_IP dest_mask_inet
	;
osi_dest_mask::= dest_mask_iso
		| dest_mask_iso L_NUMBER
		;
idrp_import_option
		::= T_RESTRICT
		| idrp_preference_option '{' idrp_parse_import_list '}'
		;
idrp_preference_option
		::= /* Empty */
		/* just a GateD preference; same form as other GateD imports */
		| T_GATED_PREF preference
		| T_IDRP_PREF idrp_preference 
		| T_GATED_PREF preference T_IDRP_PREF idrp_preference 
		| T_IDRP_PREF idrp_preference T_GATED_PREF preference 
		;
idrp_preference_restrict_option
        ::= idrp_preference_option
        | T_RESTRICT
        ;
idrp_preference::= L_NUMBER
	;
@END:	PROTO_IDRP
@BEGIN:	PROTO_INET
/* IP Import stuff */
import_option_inet
		::= T_RESTRICT
		| preference_option '{' import_list_inet '}'
		;
import_list_inet
		::= /* Empty */
		| import_list_inet import_listen_inet L_EOS
		| import_list_inet error L_EOS
		;
import_listen_inet
		::=
			dest_mask_inet preference_restrict_option
		;
@END:	PROTO_INET
@BEGIN:	PROTO_ISO
/* ISO Import stuff */
import_option_iso	::= T_RESTRICT
		| preference_option '{' import_list_iso '}'
		;
import_list_iso	::= /* Empty */
		| import_list_iso import_listen_iso L_EOS
		| import_list_iso error L_EOS
		;
import_listen_iso	::=
			dest_mask_iso preference_restrict_option
		;
@END:	PROTO_ISO
/*  */
/* Support for Export clauses */
export_interior ::= proto_interior
		;
@BEGIN:	PROTO_IDRP
prop_source_option_idrp
    		::= T_RESTRICT
		| metric_option '{' prop_source_list_idrp '}'
		;
prop_source_list_idrp
		::= /* Empty */
		| prop_source_list_idrp prop_source_idrp L_EOS
		| prop_source_list_idrp error L_EOS
		;
prop_source_idrp::=
    /* Static routes */
	  T_PROTO prop_static interface_list_option prop_metric_option_idrp
    /* IDRP--RDIs */
        | T_PROTO idrp_prop_init T_RDI osi_rdi_or_any idrp_export_optional_info prop_metric_option_idrp
    /* IDRP--RD paths */
        | T_PROTO rdpath_prop_init T_RDPATH rdpath_spec prop_metric_option_idrp
	;
prop_metric_option_idrp
    	::= T_RESTRICT
	| metric_option prop_restrict_list_option_idrp
	;
prop_restrict_list_option_idrp
		::=	/* Empty */
		| '{' prop_restrict_list_idrp '}'
		;
prop_restrict_list_idrp
		::= /* Empty */
		| prop_restrict_list_idrp prop_restrict_idrp L_EOS
		| prop_restrict_list_idrp error L_EOS
		;
prop_restrict_idrp ::= prop_restrict_iso
@BEGIN:	PROTO_INET
		| T_IP prop_restrict_inet
@END:	PROTO_INET
		;
@END:	PROTO_IDRP
@BEGIN:	PROTO_ISO
prop_source_option_iso
    		::= T_RESTRICT
		| metric_option '{' prop_source_list_iso '}'
		;
prop_source_list_iso
		::= /* Empty */
		| prop_source_list_iso prop_source_iso L_EOS
		| prop_source_list_iso error L_EOS
		;
prop_source_iso	::= T_PROTO prop_direct interface_list_option prop_metric_option_iso
    /* Static routes */
		| T_PROTO prop_static interface_list_option prop_metric_option_iso
    /* Aggregate routes */
		| T_PROTO prop_aggregate prop_metric_option_iso
    /* Kernel static routes (routing socket) */
		| T_PROTO prop_kernel interface_list_option prop_metric_option_iso
		...
		;
prop_metric_option_iso
    		::= T_RESTRICT
		| metric_option prop_restrict_list_option_iso
		;
prop_restrict_list_option_iso
		::=	/* Empty */
		| '{' prop_restrict_list_iso '}'
		;
prop_restrict_list_iso
		::= /* Empty */
		| prop_restrict_list_iso prop_restrict_iso L_EOS
		| prop_restrict_list_iso error L_EOS
		;
prop_restrict_iso
		::=
			dest_mask_iso metric_restrict_option
		;
@END:	PROTO_ISO
@BEGIN:	PROTO_INET
prop_source_option_inet
    		::= T_RESTRICT
		| metric_option '{' prop_source_list_inet '}'
		;
prop_source_list_inet
		::= /* Empty */
		| prop_source_list_inet prop_source_inet L_EOS
		| prop_source_list_inet error L_EOS
		;
prop_source_inet
    /* Interfaces */
		::= T_PROTO prop_direct interface_list_option prop_metric_option_inet
    /* Static routes */
		| T_PROTO prop_static interface_list_option prop_metric_option_inet
    /* Aggregate routes */
		| T_PROTO prop_aggregate prop_metric_option_inet
    /* Kernel static routes (routing socket) */
		| T_PROTO prop_kernel interface_list_option prop_metric_option_inet
    /* Internal default route */
		| T_PROTO prop_default prop_metric_option_inet
@BEGIN:	AUTONOMOUS_SYSTEM
		| T_PROTO proto_exterior T_AS as prop_metric_option_inet
@END:	AUTONOMOUS_SYSTEM
@BEGIN:	PROTO_ASPATHS
    /* AS paths */
		| T_PROTO aspath_prop_init aspath_match prop_metric_option_inet
    /* Tags */
    		| T_PROTO tag_prop_init T_TAG tag prop_metric_option_inet
@END:	PROTO_ASPATHS
		...
		;
prop_direct	::= T_DIRECT
		;
prop_static	::= T_STATIC
		;
prop_aggregate	::= T_AGGREGATE
		;
prop_kernel	::= T_KERNEL
		;
prop_default	::= T_DEFAULT
		;
@BEGIN:	PROTO_INET
prop_metric_option_inet
    		::= T_RESTRICT
		| metric_option prop_restrict_list_option_inet
		;
prop_restrict_list_option_inet
		::=	/* Empty */
		| '{' prop_restrict_list_inet '}'
		;
prop_restrict_list_inet
		::= /* Empty */
		| prop_restrict_list_inet prop_restrict_inet L_EOS
		| prop_restrict_list_inet error L_EOS
		;
prop_restrict_inet
		::=
			dest_mask_inet metric_restrict_option
		;
@END:	PROTO_INET
/*  */
/**/
@BEGIN:	PROTO_ISO
dest_mask_iso	::= all_mask_iso
		| default_mask_iso
		| network_mask_flags_iso
		| host_mask_iso
		;
all_mask_iso	::= T_ALL
		;
default_mask_iso
		::= T_DEFAULT
		;
/* Gateway list */
gateway_list_iso
		::= gateway_iso
		| gateway_list_iso gateway_iso
		;
/* A gateway is a host on an attached network */
gateway_iso	::= host_iso
		;
host_iso	::= addr_iso
		;
host_mask_iso	::= T_HOST host_iso
		;
network_iso	::= addr_iso
		;
network_mask_iso
		::= network_iso
		| network_iso T_MASKLEN number
		| network_iso T_MASK mask_iso
		;
network_mask_flags_iso
		::= network_mask_iso dm_flags
		;
mask_iso	::= addr_iso
		;
osi_hex::= L_HEXSTRING
	;
addr_iso::= L_ISOADDR
	;
@END:	PROTO_ISO
/* Common to both */
host		::= 
		...
@BEGIN:	PROTO_ISO
		| host_iso
@END:	PROTO_ISO
		;
mask		::= 
		...
@BEGIN:	PROTO_ISO
		| mask_iso
@END:	PROTO_ISO
		;
addr		::= 
		...
@BEGIN:	PROTO_ISO
		| addr_iso
@END:	PROTO_ISO
		;
gateway_list	::= 
		...
@BEGIN:	PROTO_ISO
		| gateway_list_iso
@END:	PROTO_ISO
		;
dm_flags	::= /* Empty */
		| T_EXACT
		| T_REFINE
		;
/* Host name */
host_name	::= L_HNAME
		| L_KEYWORD
		| string
		;

onoff_option	::= T_ON				| T_OFF				;
null_or_restrict ::= /* empty */
	| T_RESTRICT
	;
/* Metric */
metric		::= number
		| T_INFINITY
		;
metric_option	::= /* Empty */
		| T_METRIC metric
		;
metric_restrict_option
		::= metric_option
		| T_RESTRICT
		;
/* Preference */
preference_option
		::= /* Empty */
		| T_PREFERENCE preference
		;
preference_restrict_option
		::= preference_option
		| T_RESTRICT
		;
preference	::= L_NUMBER
		;
/* Numbers and such */
string		::= L_STRING
		;
number		::= L_NUMBER
		| byte_string
		;