Parse engine grammar.
Lexical elements:
URLCHAR = Letters (A-Z and a-z), numbers (0-9) and the characters '.', '-', '~' and '_', plus we treat # as a character because
we don't distinguish is for processing.
!OTHER! (meaning anything not listed).
PERCENT = %
SPLAT = *
FSLASH = /
PLUS = +
QUEST = ?
AMP = &
EQU = =
Registers
Method - request.method
Server - request.server
Path - request.path
(Hex)Sixteens
Flags
DoneURI
GEThttp://www.yahoo.com/monkey%20head/?l=1207011680%20monkeHTTP-Version
method
[START]
-> NULL->$Method
-> NULL->$Server
-> NULL->$Path
-> NULL->$Version
-> NULL->$(Hex)Sixteens
-> FALSE->!DoneURI
-> [OPEN]
-> ^RETURN^
[OPEN]
- URLCHAR - push, METHOD, ^RETURN^
- !OTHER! - [DEPLETE], error(must start with a character)
- !EOF! - fault(No request present)
[METHOD]
- URLCHAR - push
- PERCENT - [ESCAPE]
- WS - pop->$Method, [POSTMETHOD], ^RETURN^
- CR | LF - error(terminated after METHOD)
- !OTHER! - [DEPLETE], error(expecting method)
- !EOF! - fault(Only METHOD present)
[POSTMETHOD]
- WS - burn
- SPLAT - ""->$Server, ->$Path, [STAR], ^RETURN^
- FSLASH - ""->$Server, push, [PATH], ^RETURN^
- URLCHAR - push, [SERVER], ^RETURN^
- PERCENT - [ESCAPE]
- QUEST - [DEPLETE], error(expecteding PATH before URI)
- CR | LF - [DRAIN], error(terminated before URI)
- !OTHER! - [DEPLETE], error(bad characters)
- !EOF! - error(No URI present)
[STAR]
- WS - burn, [POSTSTAR], ^RETURN^
- CR | LF - [DRAIN], error(terminated without version))
- !OTHER! - [DEPLETE], error(excess characters after SPLAT)
- !EOF! - error(No URI present)
[POSTSTAR]
- WS - burn
- CR | LF - [DRAIN], error(terminated without version))
- URLCHAR - push, [VERSION], ^RETURN^
- !OTHER! - [DEPLETE], error(bad characters)
- !EOF! - error(No Version present)
[SERVER]
- PERCENT - [ESCAPE]
- WS - pop->$Server, ""->$Path, [VERSION], ^RETURN^
- FSLASH - pop->$Server, push, [PATH], ^RETURN^
- QUEST - [DEPLETE], error(expecteding PATH before URI query)
- URLCHAR - push
- CR | LF - [DRAIN], error(terminated before finishing URI)
- !OTHER! - [DEPLETE], error(bad characters)
- !EOF! - error(No compelted URI)
[PATH]
- PERCENT - [ESCAPE]
- URLCHAR - push
- FSLASH - push
- AMP - push
- PLUS - push(" ")
- WS - pop->$Path, [VERSION], ^RETURN^
- QUEST - pop->$Path, [START_URI], ^RETURN^
- CR | LF - [DRAIN], error(terminated without version)
- !OTHER! - [DEPLETE], error(bad characters in path)
- !EOF! - error(No completed URI)
[START_URI]
- PERCENT - [ESCAPE], [NAME]
- URLCHAR - push, [NAME], if(!DoneURL==TRUE) ^RETURN^
- PLUS - push(" "), [NAME], if(!DoneURL==TRUE) ^RETURN^
- WS - [POST_URI], ^RETURN^
- CR | LF - [DRAIN], error(terminated without version)
- !OTHER! - [DEPLETE], error(bad characters in URI)
- !EOF! - error(No completed URI)
[NAME]
- PERCENT - [ESCAPE]
- WS - [DEPLETE], error(broken name in URI)
- URLCHAR - push
- SPECIAL_SLASH - push("/");
- PLUS - push(" ")
- EQU - pop->$Name, [START_VALUE], ^RETURN^
- CR | LF - [DRAIN], error(terminated without completing query name)
- !OTHER! - [DEPLETE], error(bad characters in URI query name)
- !EOF! - error(Truncated URI)
[START_VALUE]
- PERCENT - [ESCAPE], [VALUE], ^RETURN^
- WS - TRUE->!DoneURI, [SETNV_EMPTY], [POST_URI], ^RETURN
- EQ - push, [VALUE], ^RETURN^
- URLCHAR - push, [VALUE], ^RETURN^
- SPECIAL_SLASH - push("/"), [VALUE], ^RETURN^;
- PLUS - push(" "), [VALUE], ^RETURN^
- AMP - [SETNV], ^RETURN^
- CR | LF - [DRAIN], error(terminated completing name/value)
- !OTHER! - [DEPLETE], error(bad characters when starting value in URI)
- !EOF! - error(Truncated URI missing value for query item.)
[VALUE]
- PERCENT - [ESCAPE]
- URLCHAR - push
- EQUAL - push
- SPECIAL_SLASH - push("/")
- PLUS - push(" ")
- WS - TRUE->!DoneURI, [SETNV], [POST_URI], ^RETURN^
- AMP - [SETNV], ^RETURN^
- CR | LF - [DRAIN], error(terminated while completing query value)
- !OTHER! - [DEPLETE], error(bad characters for value in URI)
- !EOF! - error(Truncated URI)
[SETNV]
-> pop->$Value
-> (Set request NV to $Name/$Value
-> ^RETURN^
[SETNV_EMPTY]
-> (Set request NV to $Name/"" (blank)
-> ^RETURN^
[POST_URI]
- WS - burn
- URLCHAR - push, [VERSION], ^RETURN^
- SPECIAL_SLASH - push("/") , ^RETURN^
- CR | LF - [DRAIN], error(terminated without completing VERSION)
- !OTHER! - [DEPLETE], error(bad character starting VERSION)
- !EOF! - error(No version present.)
[VERSION]
- URLCHAR - push
- FSLASH - push
- CR | LF - [DRAIN], pop->$Version, ^RETURN^
- WS - [DEPLETE], error(spaces after VERSION)
- !OTHER! - [DEPLETE], error(bad character in VERSION)
- !EOF! - error(Truncated VERSION.)
[ESCAPE]
- HEX - ->$Sixteens, ESCAPEONES, ^RETURN^
- !OTHER! - error(broken escape)
- !EOF! - error(Truncated line with dangling escape.)
[ESCAPEONES]
- HEX - push( ($SixteensSPLAT16)PLUSHEX ), ^RETURN^
- !OTHER! - error(broken escape)
- !EOF! - error(Truncated line with dangling escape.)
[DEPLETE]
- CR - [DEPLETE_CR], ^RETURN^
- !OTHER! - burn
- !EOF! - error(missing CR at end of line)
[DEPLETE_CR]
- LF - ^RETURN^
- !EOF! - error(missing LF after CR at end of line: truncated.)
- !OTHER! - fault(missing LF after CR at end of line: odd characters found, so stream is unreliable.)
[DRAIN]
- LF - burn, ^RETURN^
- CR - burn, ^RETURN^
- !EOF! - error(bad CR/LF line termination: truncated.)
- !OTHER! - fault(bad CR/LF line termination: odd characters found, so stream is unreliable.)
- Parameters:
source
- the stream source.request
- the request object to fill.
- Throws:
ThingsException
- If it is a fault, the request should be considered completely invalid. If it is an error, whatever was set in the request might be useful.
java.io.IOException
- if the source is dead.
java.lang.Throwable