Recursive descent parsing
-
Upload
hyatt-sutton -
Category
Documents
-
view
58 -
download
3
description
Transcript of Recursive descent parsing
![Page 1: Recursive descent parsing](https://reader033.fdocuments.in/reader033/viewer/2022061609/56812ce4550346895d91aac1/html5/thumbnails/1.jpg)
Recursive descent parsing
Programming Language Design and Implementation (4th Edition)
by T. Pratt and M. Zelkowitz
Prentice Hall, 2001
Section 3.4
![Page 2: Recursive descent parsing](https://reader033.fdocuments.in/reader033/viewer/2022061609/56812ce4550346895d91aac1/html5/thumbnails/2.jpg)
2
Recursive descent parsing overview
A simple parsing algorithm Shows the relationship between the formal description of a progr
amming language and the ability to generate executable code for programs in the language.
Use extended BNF for a grammar, e.g., expressions: <arithmetic expression>::=<term>{[+|-]<term>}* Consider the recursive procedure to recognize this: procedure Expression; begin Term; /* Call Term to find first term */ while ((nextchar=`+') or (nextchar=`-')) do begin nextchar:=getchar; /* Skip over operator
*/ Term end end
![Page 3: Recursive descent parsing](https://reader033.fdocuments.in/reader033/viewer/2022061609/56812ce4550346895d91aac1/html5/thumbnails/3.jpg)
3
Generating code
Assume each procedure outputs its own postfix (Section 8.2, to be discussed later)
To generate code, need to output symbols at appropriate places in procedure.
procedure Expression; begin Term; /* Call Term to find first term */ while ((nextchar=`+') or (nextchar=`-')) do begin nextchar:=getchar; /* Skip over oper
ator */ Term; output previous ‘+’ or ‘-’; end end
![Page 4: Recursive descent parsing](https://reader033.fdocuments.in/reader033/viewer/2022061609/56812ce4550346895d91aac1/html5/thumbnails/4.jpg)
4
Generating code (continued)
Each non-terminal of grammar becomes a procedure. Each procedure outputs its own postfix. Examples: procedure Term; begin Primary; while ((nextchar=`*') or (nextchar=`/')) do begin nextchar:=getchar; /* Skip over oper
ator */ Primary; output previous ‘*’ or ‘/’; end end Procedure Identifier; begin if nextchar= letter output letter else error; nextchar=getchar; end Figure 3.13 of text has complete parser for expressions.
![Page 5: Recursive descent parsing](https://reader033.fdocuments.in/reader033/viewer/2022061609/56812ce4550346895d91aac1/html5/thumbnails/5.jpg)
5
Recursive Descent ParsingRecall the expression grammar, after transformation
This produces a parser with sixmutually recursive routines: • Goal • Expr • EPrime • Term • TPrime • Factor
Each recognizes one NT or T
The term descent refers to thedirection in which the parse treeis built.
![Page 6: Recursive descent parsing](https://reader033.fdocuments.in/reader033/viewer/2022061609/56812ce4550346895d91aac1/html5/thumbnails/6.jpg)
6
Recursive Descent ParsingA couple of routines from the expression parser
![Page 7: Recursive descent parsing](https://reader033.fdocuments.in/reader033/viewer/2022061609/56812ce4550346895d91aac1/html5/thumbnails/7.jpg)
7
Transition diagrams for the grammar
0 102E :T
1E'
3E' :+
4T
1065E'
7 109T :F
8T'
10T' : * 11F
101312T'
14F :(
15E
101716)
id
EE'T
T'F
TE'+TE' | FT'*FT' | (E) | id
Grammar
![Page 8: Recursive descent parsing](https://reader033.fdocuments.in/reader033/viewer/2022061609/56812ce4550346895d91aac1/html5/thumbnails/8.jpg)
8
Simplified transition diagrams.
3E' :+
4T
5
106
3E' :+
4
T
106
3E :+
4
T
106
0T
3E :
+
106
0T
(a) (b)
(c) (d)
![Page 9: Recursive descent parsing](https://reader033.fdocuments.in/reader033/viewer/2022061609/56812ce4550346895d91aac1/html5/thumbnails/9.jpg)
9
Simplified transition diagrams for arithmetic expressions.
*
7 1013T :F
8
14F :(
15E
101716)
id
+
0 106E :T
3
![Page 10: Recursive descent parsing](https://reader033.fdocuments.in/reader033/viewer/2022061609/56812ce4550346895d91aac1/html5/thumbnails/10.jpg)
10
Example transition diagrams
An expression grammar with left recursion and ambiguity removed:
E’ -> + T E’ | ε T -> F T’ T’ -> * F T’ | ε F -> ( E ) | id E -> T E’
Corresponding transition diagrams:
![Page 11: Recursive descent parsing](https://reader033.fdocuments.in/reader033/viewer/2022061609/56812ce4550346895d91aac1/html5/thumbnails/11.jpg)
11
Predictive parsing without recursion To get rid of the recursive procedure calls, we maintain
our own stack.
![Page 12: Recursive descent parsing](https://reader033.fdocuments.in/reader033/viewer/2022061609/56812ce4550346895d91aac1/html5/thumbnails/12.jpg)
12
Example Use the table-driven predictive parser to parse
id + id * id Assuming parsing table
Initial stack is $E Initial input is id + id * id $
![Page 13: Recursive descent parsing](https://reader033.fdocuments.in/reader033/viewer/2022061609/56812ce4550346895d91aac1/html5/thumbnails/13.jpg)
13
LR parsing
![Page 14: Recursive descent parsing](https://reader033.fdocuments.in/reader033/viewer/2022061609/56812ce4550346895d91aac1/html5/thumbnails/14.jpg)
14
LR parsing example
Grammar: 1. E -> E + T 2. E -> T 3. T -> T * F 4. T -> F 5. F -> ( E ) 6. F -> id