forked from protiumx/rq
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgrammar.pest
72 lines (61 loc) · 1.55 KB
/
grammar.pest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
file = {
SOI ~
((request | var_def_block) ~
(DELIM ~ (request | var_def_block))*)? ~
EOI
}
DELIM = _{ "###" }
WHITESPACE = _{ " " }
VAR_BEGIN = _{ "{{" }
VAR_END = _{ "}}" }
char = { !(" " | "\n" | "\t") ~ ANY }
request = {
NEWLINE* ~
method? ~ url ~ query? ~ version? ~ NEWLINE ~
headers? ~
NEWLINE ~
body? ~
NEWLINE*
}
method = { "GET" | "DELETE" | "POST" | "PUT" }
url = ${ (var | url_fragment)+ }
url_fragment = @{ (!(VAR_BEGIN | "?") ~ char)+ }
query = @{
PUSH(NEWLINE ~ (" " | "\t")* | "") ~
"?" ~ query_item ~
(PEEK ~ "&" ~ query_item)* ~
DROP
}
query_item = ${ query_name ~ "=" ~ query_value }
query_name = @{ (!"=" ~ char)+ }
query_value = $ { (var | query_value_fragment)+ }
query_value_fragment = @{
(
PUSH("\"" | "'") ~
(!PEEK ~ ANY)+ ~
POP
) |
(!("&" | VAR_BEGIN) ~ char)+
}
version = { "HTTP/" ~ ("0.9" | "1.0" | "1.1" | "2.0" | "3.0") }
headers = { (header ~ NEWLINE)+ }
header = { header_name ~ ":" ~ header_value }
header_name = @{ (!":" ~ char)+ }
header_value = ${ (var | header_value_fragment)+ }
header_value_fragment = @{ (!VAR_BEGIN ~ (char | " "))+ }
body = ${ (var | body_fragment)+ }
body_fragment = @{ (!(VAR_BEGIN | DELIM)~ ANY)+ }
var = ${ VAR_BEGIN ~ var_name ~ VAR_END }
var_name = @{ (!VAR_END ~ char)+ }
var_def_block = { (NEWLINE* ~ var_def ~ NEWLINE*)+ }
var_def = ${ "@" ~ var_def_name ~ " "? ~ "=" ~ " "? ~ var_def_value }
var_def_name = @{ (!"=" ~ char)+ }
var_def_value = ${ (var | var_def_value_fragment)+ }
var_def_value_fragment = @{
(
PUSH("'" | "\"") ~
(!PEEK ~ ANY)+ ~
POP
) |
(!VAR_BEGIN ~ char)+
}