IDRP BNF syntax

	- L_EOS means the semicolon character (';')

	- Other L_* symbols stand for elements returned by the lexical
	  analyzer (the lexer.l file), and are generally self-explanatory;
	  e.g., L_NUMBER, L_ISOADDR, etc., are what they say they are.

	- T_* symbols generally stand for a keyword; the exact keyword
	  (or range of keywords) can be discovered by fgrep-ing for the
	  T_... symbol in question in the parse.c file (NOT parser.c;
	  parse.c--one 'r').

	- Other literal characters are indicated by the character enclosed
	  by single quotes, e.g., '{' and '}', which must be liter

Syntax


define_statement
		::= 
                | T_RDI osi_rdi L_EOS
                | osi_tagged_address L_EOS
		;

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
			| T_RIBSUPPORT 
 				'{' idrp_rib_entries '}'
			;	
/* 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
			;
idrp_rib_entries ::= 	idrp_rib_entry L_EOS	
		 	| idrp_rib_entries idrp_rib_entry L_EOS
			| idrp_rib_entries error L_EOS
			; 
idrp_rib_entry::=		T_RIB idrp_rib_value  
 			'{' idrp_ps_rib_entries '}'
			;	
/* idrp rib id number */
idrp_rib_value ::= L_NUMBER
			;
idrp_ps_rib_entries	::= idrp_ps_rib_entry L_EOS
			| idrp_ps_rib_entries idrp_ps_rib_entry L_EOS
			| idrp_ps_rib_entries error L_EOS
			;  
idrp_ps_rib_entry	::=  T_TRANSITDELAY idrp_transit_delay_value
			| T_RDLRE idrp_rdlre_value
			| T_EXPENSE idrp_expense_value
			| T_PRIORITY idrp_priority_value
			| T_SECURITY idrp_security_type idrp_security_value
			| T_KERNEL L_HEXSTRING 
			| T_ISO
			| T_INET
			;	
/* this _was_ idrp_sock_options (i.e., plural form) */
idrp_sock_support::= T_PROTOSOCK idrp_sock_option
		;
/* 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
			| T_SECURITY idrp_security_type idrp_security_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_security_type::= T_FAA_ADMIN
		   | T_FAA_GENCOM
		   | T_FAA_OPS
		   | T_FAA_SYSMGT
		;	
idrp_security_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
			| T_RIBSUPPORT T_ALL
			| T_RIBSUPPORT idrp_peer_rib_ids
			;
idrp_peer_rib_ids	::= idrp_peer_rib_id 		
                        | idrp_peer_rib_ids idrp_peer_rib_id
			;
idrp_peer_rib_id	::= L_NUMBER
			;
/*
 * 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
		
control_statement
		::= 
	| 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
	| T_EXPORT T_PROTO control_idrp 
	  T_RDI osi_rdi_or_any prop_source_option_idrp L_EOS
		;	

import_interior ::= proto_interior
		;
/* 
	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
	| T_SECURITY idrp_security_type idrp_security_value
	;
idrp_ps_snpa_rt_option	::= T_SNPA
	;
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_any '/'
	; 
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::= L_RE_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
@BEGIN:	PROTO_ISIS
    /* ISIS imports */
		| T_PROTO isis_prop_init prop_metric_option_iso
@END:	PROTO_ISIS
		;
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
		;
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_INET
/* Addresses */
/* IP address */
dest_mask_inet	::= all_mask_inet
		| default_mask_inet
		| host_mask_inet
		| network_mask_flags_inet
		;
all_mask_inet	::= T_ALL
		;
default_mask_inet
		::= T_DEFAULT
		;
/* Gateway list */
gateway_list_inet
		::= gateway_inet
		| gateway_list_inet gateway_inet
		;
/* A gateway is a host on an attached network */
gateway_inet	::= host_inet
		;
host_inet	::= host_name
		| addr_inet
		;
host_mask_inet	::= T_HOST host_inet
		;
network_inet	::= host_name
		| addr_inet
		;
network_mask_inet
		::= network_inet
		| network_inet T_MASKLEN number
		| network_inet T_MASK mask_inet
		;
network_mask_flags_inet
		::= network_mask_inet dm_flags
		;
mask_inet	::= in_addr
		;
addr_inet	::= in_addr
		;
in_addr		::= L_NUMBER
		| byte_string
		;
/* TTLs */
inet_ttl	::= L_NUMBER
		;
@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
/* SJR--to do, if we really need this (makes 54 reduce/reduce conflicts)...
	| L_NUMBER
 */
	| L_HEXNUMBER
	;
@END:	PROTO_ISO
/* Common to both */
host		::= T_NOP_SOCKADDR
@BEGIN:	PROTO_INET
		| host_inet
@END:	PROTO_INET
@BEGIN:	PROTO_ISO
		| host_iso
@END:	PROTO_ISO
		;
mask		::= T_NOP_SOCKADDR
@BEGIN:	PROTO_INET
		| mask_inet
@END:	PROTO_INET
@BEGIN:	PROTO_ISO
		| mask_iso
@END:	PROTO_ISO
		;
addr		::= T_NOP_SOCKADDR
@BEGIN:	PROTO_INET
		| addr_inet
@END:	PROTO_INET
@BEGIN:	PROTO_ISO
		| addr_iso
@END:	PROTO_ISO
		;
gateway_list	::= T_NOP_ADV
@BEGIN:	PROTO_INET
		| gateway_list_inet
@END:	PROTO_INET
@BEGIN:	PROTO_ISO
		| gateway_list_iso
@END:	PROTO_ISO
		;
dm_flags	::= /* Empty */
		| T_EXACT
		| T_REFINE
		;
@END:	PROTO_INET
/* 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
		;
byte_string	::= L_HEXSTRING
		| L_OCTETSTRING
		;
@BEGIN:	PARSE_UTIME
utime		::= time '.' L_USEC
		;
@END:	PARSE_UTIME
time		::= L_NUMBER
		| L_NUMBER ':' L_NUMBER
		| L_NUMBER ':' L_NUMBER ':' L_NUMBER
		;