I am working on a parser with boost spirit x3. I finished the grammar and the parser parses as expected. Now I want to add error handling, so I have to add expectation points to my grammar.
My question is when exactly can I use the expectation operator
a > b
a >> b
The expectation operator essentially disables back-tracking. If
b must always follow
a, it is a good time to use an expectation point :
>. If there is some combination of logic that can result in an
a followed by something else, you should not use expectation but instead
If you have alternatives in your grammar, you will want to pay special attention that you have not defeated valid back tracks.
For example, if you are writing a language parser that requires the conditional expression of an if statement to be in parenthesis, a valid grammar might include:
if_statement = lit("if") > '(' > statement > ')';
if is a keyword and it must be followed by a
(. Perhaps there is whitespace between the
( but the keyword
if must be followed by a
(Note: the reality is that the grammar is a little more complex than that. For
if to be a keyword it can't just match some token that starts with the letter i and f)
You can use
a > b in your grammar if you know at the point that the rule is encountered an
a must always be followed by a
b. You might have a
a >> b somewhere else in the overall grammar.