REBOL [
    Title: "URI"
    Date: 3-Jul-2002
    Name: URI
    Version: 1.0.0
    File: %URI.r
    Author: "Andrew Martin"
    Needs: [%Common%20Parse%20Values.r]
    Purpose: "URI parse rules."
    Email: Al.Bri@xtra.co.nz
    Web: http://valley.150m.com
    Category: [util net text 5]
]

make object! [
    Char: union AlphaDigit charset "-_~+*'"
    Escape: [#"%" Hex Hex]
    Chars: [some [Char | Escape]]
    User: [some [Char | Escape | #"."]]
    Domain-Label: Chars
    Domain: [Domain-Label any [#"." Domain-Label]]
    IP-Address: [Digits #"." Digits #"." Digits #"." Digits]
    Host: [Domain | IP-Address]
    eMail: [User #"@" Host]
    Pass: Chars
    Port: [1 4 Digit]
    User-Pass-Host-Port: [
        [User #":" Pass #"@" Host #":" Port]
        | [User #":" Pass #"@" Host]
        | [User #":" Host]
        | [Host #":" Port]
        | [Host]
        ]
    Fragment: [#"#" Chars]
    Query: [some [#"?" any [Chars #"=" Chars | Chars]]]
    Fragment_Or_Query: [Fragment | Query]
    Extension: [#"." 1 4 Chars]
    File: [Chars opt [#"." Chars]]
    Path: [some ["../" | "./" | [File #"/"]]]
    Relative-Path: [
        Path opt File opt Extension opt Fragment_Or_Query
        | opt Path File opt Extension opt Fragment_Or_Query
        | opt Path opt File Extension opt Fragment_Or_Query
        | opt Path opt File opt Extension Fragment_Or_Query
        ]
    Absolute-Path: [#"/" opt Relative-Path]
    Net-Path: ["//" User-Pass-Host-Port opt [Absolute-Path]]
    Scheme: [Alpha some Char]
    URL: [Scheme #":" Net-Path]
    Local-File: [#"%" [Absolute-Path | Relative-Path]]
    set 'URI [eMail | URL | Local-File]
    ]