WHITESPACE = _{ " " | "\t" | "\r" | "\n" }
COMMENT = _{ "#" ~ (!"\n" ~ ANY)* }
file = { SOI ~ header ~ block* ~ EOI }
header = { "webnn_graph" ~ string ~ "v" ~ int ~ quantized? ~ "{" }
block = _{ inputs_block | consts_block | nodes_block | outputs_block | "}" }
inputs_block = { "inputs" ~ "{" ~ input_decl* ~ "}" }
consts_block = { "consts" ~ "{" ~ const_decl* ~ "}" }
nodes_block = { "nodes" ~ "{" ~ stmt* ~ "}" }
outputs_block = { "outputs" ~ "{" ~ output_item* ~ "}" }
input_decl = { ident ~ ":" ~ ty ~ ";" }
const_decl = { ident ~ ":" ~ ty ~ const_annot* ~ ";" }
output_item = { ident ~ ("," ~ ident)* ~ ";"? }
stmt = { (multi_assign | assign) ~ ";" }
assign = { ident ~ "=" ~ expr }
multi_assign = { "[" ~ ident ~ ("," ~ ident)* ~ "]" ~ "=" ~ expr }
expr = { call | ident | literal }
call = { ident ~ "(" ~ args? ~ ")" }
args = { arg ~ ("," ~ arg)* }
arg = { (ident ~ "=" ~ value) | value }
value = { literal | ident }
literal = _{ array | object | string | number | boolean | null }
array = { "[" ~ (value ~ ("," ~ value)*)? ~ "]" }
object = { "{" ~ (object_item ~ ("," ~ object_item)*)? ~ "}" }
object_item = { (string | ident) ~ ":" ~ value }
boolean = { "true" | "false" }
null = { "null" }
ty = { dtype ~ shape }
dtype = { "f32" | "f16" | "i4" | "u4" | "i32" | "u32" | "i64" | "u64" | "i8" | "u8" }
shape = { "[" ~ (shape_dim ~ ("," ~ shape_dim)*)? ~ "]" }
shape_dim = { dynamic_dim | int }
dynamic_dim = { "dyn" ~ "(" ~ string ~ "," ~ int ~ ")" }
quantized = { "@quantized" }
// @weights("key") or @scalar(1.0) or @bytes([1,2,3])
const_annot = {
"@weights" ~ "(" ~ string ~ ")"
| "@scalar" ~ "(" ~ number ~ ")"
| "@bytes" ~ "(" ~ byte_array ~ ")"
}
byte_array = { "[" ~ (int ~ ("," ~ int)*)? ~ "]" }
ident = @{ (ASCII_ALPHA | "_" | "/" | "$") ~ (ASCII_ALPHANUMERIC | "_" | "." | "/")* }
int = @{ ASCII_DIGIT+ }
number = @{ "-"? ~ ASCII_DIGIT+ ~ ("." ~ ASCII_DIGIT+)? ~ (("e" | "E") ~ ("+" | "-")? ~ ASCII_DIGIT+)? }
string = @{ "\"" ~ ( "\\\"" | "\\\\" | (!"\"" ~ ANY) )* ~ "\"" }