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