Basics
    ------


                The lay-out of this appendix is:

{basic} == (primitive) with or without leading/trailing spaces
{basic} != `word' ==> {basic} cannot include the string "word".

[ ... ] == character class or range of characters.
However, if "[", "]" enclose or surround a primitive, or a string
==> the primitive or sting is optional.
			      ^^^^^^^^

E.g.

[(nic-hdl-number)] ==> nic-handle number is optional.


-----
{free text} == (All characters possible)

-----
{auto-nic-assign} == `AUTO-'([1 or more [0..9])(0 or more [`A'..`Z'])

-----

{nic-handle} == (Japanese nic-handle) | (Standard nic-handle)

(Japanese nic-handle) == (2 [`A'..`Z'] 3 [0..9]`JP')(0 or 1 `-JP')
(Japanese nic-handle) == (Jap-nic-hdl-initials)(Jap-nic-hdl-number)`JP'\
				[(Jap-suffix)}
(Jap-nic-hdl-initials) == 2 [`A'..`Z'] == 2 uppercase letters
(Jap-nic-hdl-number) == 3 [0..9] == 0 ... 999  # leading zero allowed
(Jap-suffix) == `-JP'

(Standard nic-handle) == (nic-hdl-initials) [(nic-hdl-number)] (nic-hdl-suffix)

(nic-hdl-initials) == (2 - MAXLEN [`A'..`Z']
	MAXLEN == defined in configuration file
(nic-hdl-number) == [1..9](0 to five [0..9]) == 1 ... 99999

N.B. the nic-hdl-number is _optional_.

(nic-hdl-suffix) == <(source)| ORG | ARIN | ORG-ARIN | 1-AU | 2-AU | CC-AU>
(source) == <RIPE | RADB | INTERNIC | MCI | ANS | CANET | APNIC>
	# source is defined in configuration file

-----

{name} != `AUTO-'

{name} cannot include {Titles}, cannot include (abbreviation)
(abbreviation) == (^0 or more [non-blank])`.' || ([non-blank])`.'

# no "Amb. Magee" or "Ambrose M." 

{Titles} == ([mr|ms|mrs|dr|drs||ir|ing|sign|herr|hr|frau|prof]`.')

{name} == NUMOFNAMES x (personal name) 
# NUMOFNAMES is defined in the configuration file

(personal name) == (personal-name-part-1)(personal-name-part-2)
(personal-name-part-1) == ([`a'..`z', `A'..`Z'])
(personal-name-part-2) == (0 or more [alphanumeric, `-', `.', `|', "`", "'" ])

-----

{aut-num} == `AS'(as-integer)
(as-integer) == (1 or more [1..9])(0 or more [0..9])
(as-integer) == 0 <= as-integer < = 65535
#
# Yes; the syntax of (as-integer) prevents it from being == 0

-----

{cost} == positive, non-zero integer

-----

{brackets} == `{'.....`}'

-----

{braces} == `(' ..... `)'

-----

{netlist} == (0 or more spaces {netlist expression} 0 or more spaces)
{netlist expression} == `{'(netlist element) \ 
				[(subsequent netlist element)]`}'

(netlist element) == 0 or more spaces (Valid IP 4 prefix) \
			0 or more spaces

(subsequent netlist element) == 0 or more spaces `,' 0 or more spaces \
				(Valid IP 4 prefix) 0 or more spaces

(Valid IP 4 prefix) == (Valid IP 4)/(1 or more decimal digits)
(Valid IP 4 prefix) == (Valid IP 4)/(decimal number)

(Valid IP 4) == 0 or more `0'(#1 quad)[(subsequent quad)(subsequent quad) \
				(subsequent quad)]

# There can be 0, 1, 2 or 3 (subsequent quad)
			

(#1 quad) == (0 or 1 `1')(0 or 1 [1..9])[0..9] _or_
	     (`1'|`2')[0..4][0..9] _or_
	     `25'[0..5]

# (#1 quad) is in the range 0 ... 255

(subsequent quad) == `.'(0 or more `0')(#1 quad)

# (subsequent quad) is .00 ... .0255

# (Valid IP 4) should be four integers, separated by ".",
# where each integer is in the range 0 - 255
# 0.0.0.0 _is_ a valid IP 4 number.

-----

{askeyword} == ({aut-num} | {KEYWORD} | {community} | {as-macro} | {netlist})

{KEYWORD} == (ANY | AND | OR | NOT | `(' | `)' )

-----

{as-macro} == `AS-'(1 or more `A'...`Z')

-----
{netname} == [`A'..`Z'](0 or more [`A'..`Z'|0..9|`-'])

# {netname} must begin with an uppercase letter, but can otherwise
# have uppercase letters, digits or `-'.  {netname} cannot begin
# with a number; i.e. "193-RIPE-NET" is not allowed.

-----

{auth_NONE} == `NONE'
{auth_MAIL-FROM} == (0 or more spaces `MAIL-FROM' 0 or more spaces) \
			{valid PERL 5 regular expression}
{auth_CRYPT-PW} == `CRYPT-PW' (crypted password)
(crypted password) == string of 13 characters

-----

{CLNS prefix} == (clns0).(clns1).(clns2).(clns2)...(clns-last)
(clns0) == [0..9,`a'..`f'][0..9,`a'..`f']
(clns1) == [0..9,`a'..`f'][0..9,`a'..`f'][0..9,`a'..`f'][0..9,`a'..`f']
(clns2) == (4 of [0..9,`a'..`f'])
(clns-last) == (1 or more [0..9,`a'..`f']


{CLNS prefix} == (2 digit hexadec)(4 digit hexadec)(4 digit hexadec) ...
		 (4 digit hexadec)(1-4 digit hexadec)

-----


{RFC-822 address} == (0 or more spaces)(first name)[`.'(other name)] \ 
			`@'(DOMAINNAME)
(first name) == [1 or more non-punctuation chars]
(other name) == [1 or more non-punctuation chars]

-----

{DATE}== (year)(month)(day)
(date) == must be today or in the past
<year> == ( 2 or 4 decimal digits)
year) == (year > 88) || (year > 1988)
(month) == (0 <= month <= 12)
(day> == (0 <= day <= 31)

-----

{community} == (`A'...`Z')(community-text)
(community-text) == `A'...`Z', `0'...`9', `_', `-'
{community} != (AS | LIM- | ANY | AND | OR | NOT )

-----

{net number} == (netnum element).(netnum element).(netnum element) \ 
		.(netnum element)
(netnum element) == (1 or more [0..9]) && 
		( (netnum element) <= 255) && (netnum element) >= 0) )

-----

{domain name} == ( 1 or more alphanumeric characters ) (0 or more extensions>
(extension)   == <"." or "-"><0 or more "-"><1 or more alphanumeric>
 
# 
# N.B. this does not exactly match the definition from RFC 1034.

-----

{phone number} 
{phone number} == [0 or more sp][`+']<Country Code><Area Code><Tel Number>
<Country Code> == [0 or more sp]<Code>
<Code> == [`(' (0 or more spaces)(1 or more dec dig)(0 or more sp) `)'
                (0 or more sp)]
<Area Code> == (0 or more Area Code components)
<A C components> == (0 or more sp)(0 or more [`-', `.', `('])(0 or more sp
                (1 or more dec digit)(0 or more sp) (0 or 1 `)' )
<extension> == (0 or 1 <extn. numbers>)
<extn. numbers> == (0 or more sp)(`ext.')(0 or more sp)(1 or more dec digit)
                        (0 or more sp)
-----

{IP number} = <quad>.<quad>.<quad>.<quad>
<quad> == 0 <= X <= 255

{prefix length} == 0 <= X <= 32

-----

{Interface Address} == (IP address)
(IP address) == <net address>/<prefix>
<net address> == <net1>.<net2>.<net2>.<net2>
<net1> == 0 <= X <= 223
<net1>, <net2> == 0 <= X <= 255
<prefix> == 32

{Interface Subnet Mask} == <net address>
<net address> == <net1>.<net1>.<net1>.<net1>
<net1> == 0 <= X <= 255

------


{inetnum range} == (ip-number1) `-' (ip-number2)
			ip-number2 > ip-number1
			ip-number1 > 0, ip-number2 > 0


{inetnum prefix}/{inetnum length}

{inetnum prefix} == (1 or more dec digits)(0 or 1 <prefix element>)
<prefix element> == (`.'(0 or more [`.'|dec digit])
{inetnum prefix} =! [0/8 | 10/8 | 127/8 | 224/4]
{inetnum length} == (0 - 32)

-----

{IP address} == <net address>/<prefix>
<net address> == <net1>.<net2>.<net2>.<net2>
<net1> == 0 <= X <= 223
<net1>, <net2> == 0 <= X <= 255
<prefix> == 32

<Interface Subnet Mask> == <net address>
<net address> == <net1>.<net1>.<net1>.<net1>
<net1> == 0 <= X <= 255

-----

{Name} != `AUTO-'
{Name} cannot include <Titles>
<Titles> == ([mr|ms|mrs|dr|drs||ir|ing|sign|herr|hr|frau|prof]`.')
{Name} == (At least two characters, neither can be the `.' character)
{Name} == !(`AUTO-') && <Name-part-1><Name-part-2>
<Name-part-1> == ([`a'..`z', `A'..`Z'])
<Name-part-2> == (0 or more [alphanumeric, `-', `.', `|', "`", "'" ])

-----