WHITESPACE = _{ " " | "\t" | "\r" | "\n" }
COMMENT = _{ "//" ~ (!"\n" ~ ANY)* | "/*" ~ (!"*/" ~ ANY)* ~ "*/" }
// Main file structure
proto_file = {
SOI ~
(syntax | package | import | message_def | enum_def | service_def)* ~
EOI
}
// Basic elements
ident = @{ ASCII_ALPHA ~ (ASCII_ALPHANUMERIC | "_")* }
number = @{ ASCII_DIGIT+ }
string_lit = ${ "\"" ~ inner_str ~ "\"" }
inner_str = @{ (!("\"" | "\\") ~ ANY)* }
full_ident = @{ ident ~ ("." ~ ident)* }
// Syntax definition
syntax = { "syntax" ~ "=" ~ string_lit ~ ";" }
// Package definition
package = { "package" ~ full_ident ~ ";" }
// Import statement
import = { "import" ~ string_lit ~ ";" }
// Message definition
message_def = {
"message" ~
ident ~
"{" ~
message_element* ~
"}"
}
message_element = _{
field |
enum_def |
message_def |
";"
}
// Field definition
field = {
field_rule? ~
(primitive_type | ident) ~
ident ~
"=" ~
number ~
";"
}
field_rule = { "repeated" | "optional" | "required" }
primitive_type = {
"double" | "float" | "int32" | "int64" | "uint32" | "uint64" |
"sint32" | "sint64" | "fixed32" | "fixed64" | "sfixed32" |
"sfixed64" | "bool" | "string" | "bytes"
}
// Enum definition
enum_def = {
"enum" ~
ident ~
"{" ~
enum_value* ~
"}"
}
enum_value = {
ident ~
"=" ~
number ~
";"
}
// Service definition
service_def = {
"service" ~
ident ~
"{" ~
rpc_def* ~
"}"
}
rpc_def = {
"rpc" ~
ident ~
"(" ~
message_type ~
")" ~
"returns" ~
"(" ~
message_type ~
")" ~
(";" | "{" ~ "}")
}
message_type = { "stream"? ~ ident }