100 lines
1.6 KiB
Plaintext
100 lines
1.6 KiB
Plaintext
|
%class ProtoParser
|
||
|
%start file
|
||
|
|
||
|
file =
|
||
|
directives messages {
|
||
|
$$ = array(
|
||
|
"directives" => $1,
|
||
|
"messages" => $2
|
||
|
);
|
||
|
}.
|
||
|
|
||
|
directives =
|
||
|
{
|
||
|
$$ = array();
|
||
|
} |
|
||
|
directive semicolon directives {
|
||
|
$$ = array_merge(array($1), $3);
|
||
|
}.
|
||
|
|
||
|
directive =
|
||
|
include string {
|
||
|
$$ = array(
|
||
|
"type" => "include",
|
||
|
"file" => $2
|
||
|
);
|
||
|
}.
|
||
|
|
||
|
messages =
|
||
|
msgspec {
|
||
|
$$ = array($1);
|
||
|
} |
|
||
|
msgspec messages {
|
||
|
$$ = array_merge(array($1), $2);
|
||
|
}.
|
||
|
|
||
|
msgspec =
|
||
|
message name spar entries epar semicolon {
|
||
|
$$ = array(
|
||
|
"name" => $2,
|
||
|
"entries" => $4
|
||
|
);
|
||
|
}.
|
||
|
|
||
|
entries =
|
||
|
entry {
|
||
|
$$ = array($1);
|
||
|
} |
|
||
|
entry entries {
|
||
|
$$ = array_merge(array($1), $2);
|
||
|
}.
|
||
|
|
||
|
entry =
|
||
|
cardinality type name equals number semicolon {
|
||
|
$$ = array(
|
||
|
"cardinality" => $1,
|
||
|
"type" => $2,
|
||
|
"name" => $3,
|
||
|
"id" => $5
|
||
|
);
|
||
|
}.
|
||
|
|
||
|
cardinality =
|
||
|
repeated {
|
||
|
$$ = "repeated";
|
||
|
} |
|
||
|
optional {
|
||
|
$$ = "optional";
|
||
|
} |
|
||
|
required {
|
||
|
$$ = "required";
|
||
|
} |
|
||
|
required repeated {
|
||
|
$$ = "required repeated";
|
||
|
}.
|
||
|
|
||
|
type =
|
||
|
uint {
|
||
|
$$ = array(
|
||
|
"type" => "uint",
|
||
|
"size" => $1
|
||
|
);
|
||
|
} |
|
||
|
data {
|
||
|
$$ = array(
|
||
|
"type" => "data"
|
||
|
);
|
||
|
} |
|
||
|
data srpar string erpar {
|
||
|
$$ = array(
|
||
|
"type" => "constdata",
|
||
|
"size" => $3
|
||
|
);
|
||
|
} |
|
||
|
message name {
|
||
|
$$ = array(
|
||
|
"type" => "message",
|
||
|
"message" => $2
|
||
|
);
|
||
|
}.
|