
Data Structure
Networking
RDBMS
Operating System
Java
MS Excel
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Top-Down Parsing Without Backtracking in Compiler Design
There are two types of Top-Down Parsing without Backtracking, which are as follows −
Recursive Descent Parser
Predictive Parser
Recursive Descent Parser
A top-down parser that implements a set of recursive procedures to process the input without backtracking is known as recursive-descent parser, and parsing is known as recursive-descent parsing. The recursive procedures can be accessible to write and adequately effective if written in a language that performs the procedure call effectively.
There is a procedure for each non-terminal in the grammar. It can consider a global variable lookahead, influencing the current input token and a procedure match (Expected Token) is the action of recognizing the next token in the parsing process and advancing the input stream pointer, such that lookahead points to the next token to be parsed. Match () is effectively a call to the lexical analyzer to get the next token.
Predictive Parser
Predictive Parser is also known as Non-Recursive Predictive Parsing. A predictive parser is an effective approach of implementing recursive-descent parsing by handling the stack of activation records explicitly. The predictive parser has an input, a stack, a parsing table, and an output. The input includes the string to be parsed, followed by $, the right-end marker.
The stack includes a sequence of grammar symbols, preceded by $, the bottom-ofstack marker. Initially, the stack includes the start symbol of the grammar preceded by $. The parsing table is a two-dimensional array M[A, a] where ‘A’ is a nonterminal, and ‘a’ is a terminal or the symbol $.
The parser is controlled by a program that performs as follows − The program decides X the symbol on top of the stack and ‘a’ the current input symbol. These two symbols decide the action of the parser.
There are three possibilities such as
- If X = a = $, the parser terminate and declares successful integration of parsing.
- If X =a ≠ $, the parser pops X off the stack and advances the input pointer to the next input symbol.
- If X is a non-terminal, the program consults entry M[X, a] of the parsing table M. This entry will be either an X-production of the grammar or an error entry. If M[X, a] = [X→ UVW], the parser replaces X on top of the stack by UVW (with U on top). As output, the grammar does the semantic action associated with this production, which for the time being, it can assume is just printing the production used. If M[X, a] = error, the parser calls an error recovery routine.