-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtemplate_lang.pest
40 lines (40 loc) · 1.58 KB
/
template_lang.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
WHITESPACE = _{ " " | "\t" | NEWLINE}
NON_SILENT_WHITESPACE = { " " | "\t" | NEWLINE }
integer = @{ (ASCII_NONZERO_DIGIT ~ ASCII_DIGIT+ | ASCII_DIGIT) }
float = @{ ( ASCII_DIGIT+ ~ "." ~ ASCII_DIGIT+ ) }
numeric = _{ float | integer }
nil = { "Nil" }
bool = { "true" | "false" }
string = { "'" ~ (!"'" ~ ANY)* ~ "'" }
literal = { numeric | bool | string | nil }
infix = _{ add | sub | mul | div | op_eq | op_neq | op_and | op_or| op_eg | op_el | op_g | op_l }
op_and = { "and" }
op_or = { "or" }
add = { "+" }
sub = { "-" }
mul = { "*" }
div = { "/" }
op_eq = { "==" }
op_neq = { "!=" }
op_el = { "<=" }
op_l = { "<" }
op_eg = { ">=" }
op_g = { ">"}
prefix = _{ neg }
neg = { "-" }
identifier = @{ ASCII_ALPHA ~ (ASCII_ALPHANUMERIC | "_")* }
dot = { identifier ~ "." ~ identifier ~ ("." ~ identifier)* }
primary = _{ dot |literal | "(" ~ exp ~ ")" | identifier }
op_exp= { prefix* ~ primary ~ WHITESPACE* ~ (infix ~ WHITESPACE* ~ prefix* ~ primary)+ }
exp = { function_call | op_exp| dot | literal | identifier }
flow_if = { "if" ~ WHITESPACE* ~ exp }
flow_else = { "else" }
flow_for = { "for" ~ WHITESPACE* ~ identifier ~ WHITESPACE* ~ "in" ~ WHITESPACE* ~ exp }
flow_end = { "end" }
flow = _{ flow_if | flow_else | flow_for | flow_end }
function_call = { identifier ~ "(" ~ (exp ~ ("," ~ exp)*)? ~ ")" }
dynamic = !{ "{%" ~ WHITESPACE* ~ (flow | exp) ~ WHITESPACE* ~ "%}" }
print = !{ "{{" ~ WHITESPACE* ~ exp ~ WHITESPACE* ~ "}}"}
html = !{ (ANY ~ (!("{{" | "{%") ~ ANY)*) ~ NON_SILENT_WHITESPACE* }
invalid = !{ ("{{" | "{%") ~ ANY* }
g = ${ (dynamic | print | invalid | html)* }