You can create a grammar for the coffee data language by applying the following algorithm:
Define the parser you want as a composite of subparsers.
Repeat step 1 until every subparser is defined or is a terminal.
The parser you want to define is
From the preceding language element, you can see that a coffee description is, at a high level, the following:
coffee = name ',' roast ',' country ',' price;
A coffee's name is a word followed optionally by a former name. The former name is a word in parentheses.
name = Word (formerName | Empty); formerName = '(' Word ')';
The roast is a word followed optionally by the characters /French:
roast = Word (orFrench | Empty); orFrench = '/' "french";
The country ...