Skip to main content

module lang::uri::\syntax::RFC3986

rascal-0.34.0

Usage

import lang::uri::\syntax::RFC3986;

syntax Top

start syntax Top = URI;

syntax URI

lexical URI = Scheme scheme ":" HierPart ("?" Query)? ("#" Fragment)?;

syntax PctEncoded

lexical PctEncoded = "%" [A-Fa-f0-9] [A-Fa-f0-9];

syntax Reserved

lexical Reserved = GenDelims | SubDelims;

syntax GenDelims

lexical GenDelims = [:/?#\[\]@];

syntax SubDelims

lexical SubDelims = [!$&\'()*+,;=];

syntax Unreserved

lexical Unreserved = [A-Za-z0-9\-._~];

syntax HierPart

lexical HierPart 
= "//" Authority PathAbEmpty
| PathAbsolute
| PathRootless
| PathEmpty
;

syntax Scheme

lexical Scheme = [A-Za-z] [A-Za-z0-9+\-.]*;

syntax Authority

lexical Authority = (Userinfo "@")? Host (":" Port)?;

syntax Userinfo

lexical Userinfo = (Unreserved | PctEncoded | SubDelims | ":")*;

syntax Host

lexical Host = IPLiteral | IPv4Address | RegName;

syntax IPLiteral

lexical IPLiteral = "[" (IPv6addres | IPvFuture) "]";

syntax IPvFuture

lexical IPvFuture = "v" [A-Fa-f0-9]+ "." (Unreserved | SubDelims | ":")+;

syntax IPv6addres

lexical IPv6addres 
= H16 ":" H16 ":" H16 ":" H16 ":" H16 ":" H16 ":" LS32
| "::" H16 ":" H16 ":" H16 ":" H16 ":" H16 ":" LS32
| H16? "::" H16 ":" H16 ":" H16 ":" H16 ":" LS32
| (H16 ":" H16)? "::" H16 ":" H16 ":" H16 ":" LS32
| (H16 ":" H16 ":" H16)? "::" H16 ":" H16 ":" LS32
| (H16 ":" H16 ":" H16 ":" H16)? "::" H16 ":" LS32
| (H16 ":" H16 ":" H16 ":" H16 ":" H16)? "::" LS32
| (H16 ":" H16 ":" H16 ":" H16 ":" H16 ":" H16)? "::" H16
| (H16 ":" H16 ":" H16 ":" H16 ":" H16 ":" H16 ":" H16)? "::"
;

syntax LS32

lexical LS32 = H16 ":" H16 | IPv4Address;

syntax H16

lexical H16 = [A-Fa-f0-9] [A-Fa-f0-9] [A-Fa-f0-9] [A-Fa-f0-9] ;

syntax IPv4Address

lexical IPv4Address = DecOctet "." DecOctet "." DecOctet "." DecOctet;

syntax DecOctet

lexical DecOctet 
= [0-9]
| [1-9] [0-9]
| "1" [0-9] [0-9]
| "2" [0-4] [0-9]
| "25" [0-5]
;

syntax RegName

lexical RegName = (Unreserved | PctEncoded | SubDelims)*;

syntax Port

lexical Port = [0-9]*;

syntax Path

lexical Path 
= PathAbEmpty
| PathAbsolute
| PathNoScheme
| PathRootless
| PathEmpty
;

syntax PathAbEmpty

lexical PathAbEmpty = ("/" Segment)*;

syntax PathAbsolute

lexical PathAbsolute = "/" (SegmentNz ("/" Segment)*)? ;

syntax PathNoScheme

lexical PathNoScheme = SegmentNzNc ("/" Segment)*;

syntax PathRootless

lexical PathRootless = SegmentNz ("/" Segment)*;

syntax PathEmpty

lexical PathEmpty = ;

syntax Segment

lexical Segment = Pchar*;

syntax SegmentNz

lexical SegmentNz = Pchar+;

syntax SegmentNzNc

lexical SegmentNzNc = (Unreserved | PctEncoded | SubDelims | "@")+;

syntax Pchar

lexical Pchar = Unreserved | PctEncoded | SubDelims | ":" | "@";

syntax Query

lexical Query = (Pchar | "/" | "?")*;

syntax Fragment

lexical Fragment = (Pchar | "/" | "?")*;