Recursive-descent parsing is a top-down method of syntax analysis that executes
a set of recursive procedure to process the input. A procedure is associated
with each nonterminal of a grammar.
A predictive parsing is a special form of recursive-descent parsing, in which the current input token unambiguously determines the production to be applied at each step.
Let the grammar be:
expr → term rest
rest → + term rest | - term rest | 6
term → 0 | 1 | . . . | 9
In a recursive-descent parsing, we write code for each nonterminal of a grammar. In the case of above grammar, we should have three procedure, correspond to nonterminals expr, rest, and term.
Since there is only one production for nonterminal expr, the procedure expr is:
expr ( )
{
term ( );
rest ( );
return
}
Since there are three (3) productions for rest, procedure rest uses a global variable, 'lookahead', to select the correct production or simply selects "no action" i.e.,
E - production, indicating that lookahead variable is neither + nor -
rest ( )
{
IF (lookahead = = '+') {
match ( ' + ' );
term ( );
rest ( );
return
}
ELSE IF ( lookahead = = '-') {
match (' - ');
term ( );
rest ( );
return
{
ELSE {
return;
}
}
The procedure term checks whether global variable lookahead is a digit.
term ( ) {
IF ( isdigit (lookahead)) {
match (lookahead);
return;
}
else{
ReportError ( );
}
After loading first input token into variable 'lookahead' predictive parser
is stared by calling starting symbol, 'expr'.
If the input is error free, the parser conducts a depth-first traversal of the
parse tree and return to caller routine through expr.
Problem with Predictive Parsing: left recursion