A semantics grammar is a kind of grammar. It describes which things are related to which semantic entities.
The semantics grammar for C++
Here are some C++ semantics grammar rules:
A "local variable" is a kind of "statement".
A "local variable" has a is_constexpr of type bool.
A "local variable" has a is_static of type bool.
A "local variable" has a is_thread_local of type bool.
A "local variable" has a name of type std::string.
A "local variable" has one "type".
A "local variable" has zero or more "initializer".
A "expression" is a kind of "initializer".
A "expression / literal" is a kind of "expression".
A "expression / literal / integer" is a kind of "expression / literal".
A "expression / literal / integer / signed" is a kind of "expression / literal / integer".
A "expression / literal / integer / signed / int" is a kind of "expression / literal / integer / signed".
A "expression / literal / integer / signed / int" has a value of type int.
You could use those rules to produce this sentence:
statement | local variable | +------------+---------+---------------+----+----+ | | | | | | is_constexpr is_static is_thread_local name type initializer | | | | | | false false false x int expression | expression / literal | expression / literal / integer | expression / literal / integer / signed | expression / literal / integer / signed / int | value | 3
That sentence is valid semantics.
Things which are unrelated to a "local variable":
All you need to do now is convert from valid semantics to valid syntax:
int x{3};
The Semel Editor (TM) can do that.