Presentation is loading. Please wait.

Presentation is loading. Please wait.

CS 540 George Mason University

Similar presentations


Presentation on theme: "CS 540 George Mason University"— Presentation transcript:

1 CS 540 George Mason University
Lecture 4: LL Parsing CS 540 George Mason University

2 Parsing Symbol Table Syntax described formally
Syntatic/semantic structure tokens Syntatic structure Scanner (lexical analysis) Parser (syntax analysis) Semantic Analysis (IC generator) Code Generator Source language Target language Code Optimizer Syntax described formally Tokens organized into syntax tree that describes structure Error checking Symbol Table CS 540 Spring 2010 GMU

3 Top Down (LL) Parsing P begin simplestmt ; simplestmt ; end
P begin SS end SS  S ; SS SS  e S  simplestmt S  begin SS end begin simplestmt ; simplestmt ; end CS 540 Spring 2010 GMU

4 Top Down (LL) Parsing P SS begin simplestmt ; simplestmt ; end
P begin SS end SS  S ; SS SS  e S  simplestmt S  begin SS end SS begin simplestmt ; simplestmt ; end CS 540 Spring 2010 GMU

5 Top Down (LL) Parsing P SS SS S begin simplestmt ; simplestmt ; end
P begin SS end SS  S ; SS SS  e S  simplestmt S  begin SS end SS SS S begin simplestmt ; simplestmt ; end CS 540 Spring 2010 GMU

6 Top Down (LL) Parsing P SS SS S begin simplestmt ; simplestmt ; end
P begin SS end SS  S ; SS SS  e S  simplestmt S  begin SS end SS SS S begin simplestmt ; simplestmt ; end CS 540 Spring 2010 GMU

7 Top Down (LL) Parsing P SS SS SS S S
P begin SS end SS  S ; SS SS  e S  simplestmt S  begin SS end SS SS S SS S begin simplestmt ; simplestmt ; end CS 540 Spring 2010 GMU

8 Top Down (LL) Parsing P SS SS SS S S
P begin SS end SS  S ; SS SS  e S  simplestmt S  begin SS end SS SS S SS S begin simplestmt ; simplestmt ; end CS 540 Spring 2010 GMU

9 Top Down (LL) Parsing 1 2 4 3 6 5 P SS SS SS S S
P  begin SS end  begin S ; SS end  begin simplestmt ; SS end  begin simplestmt ; S ; SS end simplestmt ; SS end simplestmt ; end P begin SS end SS  S ; SS SS  e S  simplestmt S  begin SS end 1 P 2 SS 4 SS S 3 SS 6 5 S e begin simplestmt ; simplestmt ; end CS 540 Spring 2010 GMU

10 Grammar S S b C a B c c b b C c c S  a B | b C B  b b C C  c c
Two strings in the language: abbcc and bcc Can choose between them based on the first character of the input. b C a B c c b b C c c CS 540 Spring 2010 GMU

11 LL(k) parsing also known as the lookahead
Process input k symbols at a time. Initially, ‘current’ non-terminal is start symbol. Algorithm Loop until no more input Given next k input tokens and ‘current’ non-terminal T, choose a rule R (T  …) For each element X in rule R from left to right, if X is a non-terminal, we will need to ‘expand’ X else if symbol X is a terminal, see if next input symbol matches X; if so, update from the input Typically, we consider LL(1) CS 540 Spring 2010 GMU

12 Two Approaches Recursive Descent parsing
Code tailored to the grammar Table Driven – predictive parsing Table tailored to the grammar General Algorithm Both algorithms driven by the tokens coming from the lexer. CS 540 Spring 2010 GMU

13 Writing a Recursive Descent Parser
Generate a procedure for each non-terminal. Use next token from yylex() (lookahead) to choose (PREDICT) which production to ‘mimic’. for non-terminal X, call procedure X() for terminals X, call ‘match(X)’ Ex: B  b C D B() { if (lookahead == ‘b’) { match(‘b’); C(); D(); } else … } CS 540 Spring 2010 GMU

14 Writing a Recursive Descent Parser
Also need the following: match(symbol) { if (symbol == lookahead) lookahead = yylex() else error() } main() { lookahead = yylex(); S(); /* S is the start symbol */ if (lookahead == EOF) then accept else reject } error() { … CS 540 Spring 2010 GMU

15 Back to grammar S() { if (lookahead == a ) { match(a);B(); } S  a B
else if (lookahead == b) { match(b); C(); } S  b C else error(“expecting a or b”); } B() { if (lookahead == b) {match(b); match(b); C();} B  b b C else error(); C() { if (lookahead == c) { match(c) ; match(c) ;} C  c c CS 540 Spring 2010 GMU

16 Parsing abbcc abbcc Remaining input: S Call S() from main() S() {
if (lookahead == a ) { match(a);B(); } S  a B else if (lookahead == b) { match(b); C(); } S  b C else error(“expecting a or b”); } CS 540 Spring 2010 GMU

17 Parsing abbcc bbcc Remaining input: S a B Call B() from A(): B() {
if (lookahead == b) {match(b); match(b); C();} B  b b C else error(); } CS 540 Spring 2010 GMU

18 Parsing abbcc cc Remaining input: S a B b b C Call C() from B(): C() {
if (lookahead == c) { match(c) ; match(c) ;} C  c c else error(); } b b C CS 540 Spring 2010 GMU

19 Parsing abbcc S Remaining input: a B b b C c c CS 540 Spring 2010 GMU

20 How do we find the lookaheads?
Can compute PREDICT sets from FIRST and FOLLOW for LL(1) parsing: PREDICT(A  a) = (FIRST(a) – {e})  FOLLOW(A) if e in FIRST(a) = FIRST(a) if e not in FIRST(a) NOTE: e never in PREDICT sets For LL(k) grammars, the PREDICT sets for the productions associated with a given non-terminal must be disjoint. CS 540 Spring 2010 GMU

21 Example Assume E is the start symbol Production Predict E  T E’
= FIRST(T) = {(,id} E’  + T E’ {+} E’  e = FOLLOW(E’) = {$,)} T  F T’ = FIRST(F) = {(,id} T’  * F T’ {*} T’  e = FOLLOW(T’) = {+,$,)} F  id {id} F  ( E ) {(} FIRST(F) = {(,id} FIRST(T) = {(,id} FIRST(E) = {(,id} FIRST(T’) = {*,e} FIRST(E’) = {+,e} FOLLOW(E) = {$,)} FOLLOW(E’) = {$,)} FOLLOW(T) = {+$,)} FOLLOW(T’) = {+,$,)} FOLLOW(F) = {*,+,$,)} Assume E is the start symbol CS 540 Spring 2010 GMU

22 if (lookahead in {(,id } ) { T(); E_prime(); } E  T E’
else error(“E expecting ( or identifier”); } E_prime() { if (lookahead in {+}) {match(+); T(); E_prime();} E’  + T E’ else if (lookahead in {),end_of_file}) return; E’  e else error(“E_prime expecting +, ) or end of file”); T() { if (lookahead in {(,id}) { F(); T_prime(); } T  F T’ else error(“T expecting ( or identifier”); CS 540 Spring 2010 GMU

23 if (lookahead in {*}) {match(*); F(); T_prime();} T’  * F T’
else if (lookahead in {+,),end_of_file}) return; T’  e else error(“T_prime expecting *, ) or end of file”); } F() { if (lookahead in {id}) match(id); F  id else if (lookahead in {(} ) { match( ( ); E(); match ( ) ); } F  ( E ) else error(“F expecting ( or identifier”);} CS 540 Spring 2010 GMU

24 Parsing a + b * c E Remaining input: a+b*c CS 540 Spring 2010 GMU

25 Parsing a + b * c Remaining input: a+b*c E T E’ E() {
if (lookahead in {(,id } ) { T(); E_prime(); } else error(“E expecting ( or identifier”); } CS 540 Spring 2010 GMU

26 Parsing a + b * c Remaining input: a+b*c E T E’ F T’ T() {
if (lookahead in {(,id } ) { F(); T_prime(); } else error(“T expecting ( or identifier”); } CS 540 Spring 2010 GMU

27 Parsing a + b * c Remaining input: +b*c E T E’ F T’ id a F() {
if (lookahead in {id } ) match(id) else if (lookahead in { ( } { match( ( ); E(); match( ) ); } else error(“F expecting ( or identifier”); } id a CS 540 Spring 2010 GMU

28 Parsing a + b * c Remaining input: +b*c E T E’ F T’ id e a T_prime() {
if (lookahead in {*}) {match(*); F(); T_prime();}’ else if (lookahead in {+,),end_of_file}) return; else error(“T_prime expecting *, ) or end of file”); } } id a e CS 540 Spring 2010 GMU

29 Parsing a + b * c Remaining input: b*c E T E’ F T’ + T E’ id e a
E_prime() { if (lookahead in {+}) {match(+); T(); E_prime();}’ else if (lookahead in {),end_of_file}) return; else error(“E_prime expecting *, ) or end of file”); } } id a e CS 540 Spring 2010 GMU

30 Parsing a + b * c Remaining input: b*c E T E’ F T’ + T E’ id a F T’ e
if (lookahead in {(,id } ) { F(); T_prime(); } else error(“T expecting ( or identifier”); } id a F T’ e CS 540 Spring 2010 GMU

31 Parsing a + b * c Remaining input: *c E T E’ F T’ + T E’ id a F T’ e
if (lookahead in {id } ) match(id) else if (lookahead in { ( } { match( ( ); E(); match( ) ); } else error(“F expecting ( or identifier”); } id a F T’ e id b CS 540 Spring 2010 GMU

32 Parsing a + b * c Remaining input: c E T E’ F T’ + T E’ id a F T’ e id
T_prime() { if (lookahead in {*}) {match(*); F(); T_prime();}’ else if (lookahead in {+,),end_of_file}) return; else error(“T_prime expecting *, ) or end of file”); } } id a F T’ e id b * F T’ CS 540 Spring 2010 GMU

33 Parsing a + b * c Remaining input: E T E’ F T’ + T E’ id a F T’ e id b
if (lookahead in {id } ) match(id) else if (lookahead in { ( } { match( ( ); E(); match( ) ); } else error(“F expecting ( or identifier”); } id a F T’ e id b * F T’ id c CS 540 Spring 2010 GMU

34 Parsing a + b * c Remaining input: E T E’ F T’ + T E’ id a F T’ e id b
T_prime() { if (lookahead in {*}) {match(*); F(); T_prime();}’ else if (lookahead in {+,),end_of_file}) return; else error(“T_prime expecting *, ) or end of file”); } } id a F T’ e id b * F T’ e id c CS 540 Spring 2010 GMU

35 Parsing a + b * c Remaining input: E T E’ F T’ + T E’ id a F T’ e e id
E_prime() { if (lookahead in {+}) {match(+); T(); E_prime();}’ else if (lookahead in {),end_of_file}) return; else error(“E_prime expecting *, ) or end of file”); } } id a F T’ e e id b * F T’ e id c CS 540 Spring 2010 GMU

36 Stacks in Recursive Descent Parsing
Runtime stack Procedure activations correspond to a path in parse tree from root to some interior node E’ T F id b CS 540 Spring 2010 GMU

37 Two Approaches Recursive Descent parsing
Code tailored to the grammar Table Driven – predictive parsing Table tailored to the grammar General Algorithm Both algorithms driven by the tokens coming from the lexer. CS 540 Spring 2010 GMU

38 LL(1) Predictive Parse Tables
An LL(1) Parse table is a mapping T: Vn x Vt  production P or error For all productions A  a do For each terminal t in Predict(A a), T[A][t] = A  a Every undefined table entry is an error. CS 540 Spring 2010 GMU

39 Using LL(1) Parse Tables
ALGORITHM INPUT: token sequence to be parsed, followed by ‘$’ (end of file) DATA STRUCTURES: Parse stack: Initialized by pushing ‘$’ and then pushing the start symbol Parse table T CS 540 Spring 2010 GMU

40 Algorithm: Predictive Parsing
push($); push(start_symbol); lookahead = yylex() repeat X = pop(stack) if X is a terminal symbol or $ then if X = lookahead then else error() else /* X is non-terminal */ if T[X][lookahead] = X  Y1 Y2 …Ym push(Ym) … push (Y1) until X = $ token similar to ‘match’ similar to ‘mimic’ CS 540 Spring 2010 GMU

41 Example Production Predict NT/T + * ( ) ID $ E E’ T T’ F 1: E  T E’
{+} 3: E’  e {$,)} 4: T  F T’ 5: T’  * F T’ {*} 6: T’  e {+,$,)} 7: F  id {id} 8: F  ( E ) {(} NT/T + * ( ) ID $ E E’ T T’ F CS 540 Spring 2010 GMU

42 Production Predict NT/T + * ( ) ID $ E E’ T T’ F 1: E  T E’ {(,id}
{+} 3: E’  e {$,)} 4: T  F T’ 5: T’  * F T’ {*} 6: T’  e {+,$,)} 7: F  id {id} 8: F  ( E ) {(} NT/T + * ( ) ID $ E 1 E’ 2 3 T 4 T’ 6 5 F 8 7 CS 540 Spring 2010 GMU

43 Assume E is the start symbol
Stack Input Action $E a+b*c$ E  T E’ NT/T + * ( ) ID $ E 1 E’ 2 3 T 4 T’ 6 5 F 8 7 Assume E is the start symbol CS 540 Spring 2010 GMU

44 Stack Input Action $E $E’T NT/T + * ( ) ID $ E E’ T T’ F a+b*c$
E  T E’ $E’T T  F T’ NT/T + * ( ) ID $ E 1 E’ 2 3 T 4 T’ 6 5 F 8 7 CS 540 Spring 2010 GMU

45 Stack Input Action $E $E’T $E’T’F NT/T + * ( ) ID $ E E’ T T’ F a+b*c$
T  F T’ $E’T’F F  id NT/T + * ( ) ID $ E 1 E’ 2 3 T 4 T’ 6 5 F 8 7 CS 540 Spring 2010 GMU

46 Stack Input Action $E $E’T $E’T’F $E’T’id NT/T + * ( ) ID $ E E’ T T’
a+b*c$ E  T E’ $E’T T  F T’ $E’T’F F  id $E’T’id match NT/T + * ( ) ID $ E 1 E’ 2 3 T 4 T’ 6 5 F 8 7 CS 540 Spring 2010 GMU

47 Stack Input Action $E $E’T $E’T’F $E’T’id $E’T’ NT/T + * ( ) ID $ E E’
a+b*c$ E  T E’ $E’T T  F T’ $E’T’F F  id $E’T’id match $E’T’ +b*c$ T’  e NT/T + * ( ) ID $ E 1 E’ 2 3 T 4 T’ 6 5 F 8 7 CS 540 Spring 2010 GMU

48 Stack Input Action $E $E’T $E’T’F $E’T’id $E’T’ $E’ NT/T + * ( ) ID $
a+b*c$ E  T E’ $E’T T  F T’ $E’T’F F  id $E’T’id match $E’T’ +b*c$ T’  e $E’ E’  + T E’ NT/T + * ( ) ID $ E 1 E’ 2 3 T 4 T’ 6 5 F 8 7 CS 540 Spring 2010 GMU

49 Stack Input Action $E $E’T $E’T’F $E’T’id $E’T’ $E’ $E’ T + NT/T + * (
a+b*c$ E  T E’ $E’T T  F T’ $E’T’F F  id $E’T’id match $E’T’ +b*c$ T’  e $E’ E’  + T E’ $E’ T + NT/T + * ( ) ID $ E 1 E’ 2 3 T 4 T’ 6 5 F 8 7 CS 540 Spring 2010 GMU

50 Stack Input Action $E $E’T $E’T’F $E’T’id $E’T’ $E’ $E’ T + $E’ T NT/T
a+b*c$ E  T E’ $E’T T  F T’ $E’T’F F  id $E’T’id match $E’T’ +b*c$ T’  e $E’ E’  + T E’ $E’ T + $E’ T b*c$ NT/T + * ( ) ID $ E 1 E’ 2 3 T 4 T’ 6 5 F 8 7 CS 540 Spring 2010 GMU

51 Stack Input Action $E $E’T $E’T’F $E’T’id $E’T’ $E’ $E’ T + $E’ T NT/T
a+b*c$ E  T E’ $E’T T  F T’ $E’T’F F  id $E’T’id match $E’T’ +b*c$ T’  e $E’ E’  + T E’ $E’ T + $E’ T b*c$ NT/T + * ( ) ID $ E 1 E’ 2 3 T 4 T’ 6 5 F 8 7 CS 540 Spring 2010 GMU

52 Stack Input Action $E $E’T $E’T’F $E’T’id $E’T’ $E’ $E’ T + $E’ T
a+b*c$ E  T E’ $E’T T  F T’ $E’T’F F  id $E’T’id match $E’T’ +b*c$ T’  e $E’ E’  + T E’ $E’ T + $E’ T b*c$ $E’T id NT/T + * ( ) ID $ E 1 E’ 2 3 T 4 T’ 6 5 F 8 7 CS 540 Spring 2010 GMU

53 Parsing a + b * c Stack Input Action Stack Input Action $E a+b*c$
E  T E’ $E’T T  F T’ $E’T’F F  id $E’T’id match $E’T’ +b*c$ T’  e $E’ E’  + T E’ $E’T+ b*c$ Stack Input Action $E’T’F F  id $E’T’id match $E’T’ *c$ T’  * F T’ $E’T’F* c$ $ T’  e $E’ E’  e accept CS 540 Spring 2010 GMU

54 Stacks in Predictive Parsing
Algorithm data structure Hold terminals and non-terminals from the grammar terminals – still need to be matched from the input non-terminals – still need to be expanded CS 540 Spring 2010 GMU

55 Making a grammar LL(1) Not all context free languages have LL(1) grammars Can show a grammar is not LL(1) by looking at the predict sets For LL(1) grammars, the PREDICT sets for a given non-terminal will be disjoint. CS 540 Spring 2010 GMU

56 Example Two problems: E and T Production Predict E  E + T
= FIRST(E) = {(,id} E  T = FIRST(T) = {(,id} T  T * F T  F = FIRST(F) = {(,id} F  id = {id} F  ( E ) = {(} FIRST(F) = {(,id} FIRST(T) = {(,id} FIRST(E) = {(,id} FIRST(T’) = {*,e} FIRST(E’) = {+,e} FOLLOW(E) = {$,)} FOLLOW(E’) = {$,)} FOLLOW(T) = {+$,)} FOLLOW(T’) = {+,$,)} FOLLOW(F) = {*,+,$,)} Two problems: E and T CS 540 Spring 2010 GMU

57 Making a non-LL(1) grammar LL(1)
Eliminate common prefixes Ex: A  B a C D | B a C E Transform left recursion to right recursion Ex: E  E + T | T CS 540 Spring 2010 GMU

58 Eliminate Common Prefixes
A  a b | a d Can become: A  a A’ A’  b | d Doesn’t always remove the problem. Why? CS 540 Spring 2010 GMU

59 Why is left recursion a problem?
A a A a A a CS 540 Spring 2010 GMU

60 Remove Left Recursion A  A a1 | A a2 | … | b1 | b2 | … becomes
A  b1 A’| b2 A’| … A’  a1 A’ | a2 A’ | … | e The left recursion becomes right recursion CS 540 Spring 2010 GMU

61 A  A a | b becomes A  b B, B  a B | e
CS 540 Spring 2010 GMU

62 Expression Grammar E  E + T | T T  T * F | F
F  id | ( E ) NOT LL(1) Eliminate left recursion: E  T E’, E’  + T E’ | e T  F T’, T’  * F T’ | e F  id | ( E ) CS 540 Spring 2010 GMU

63 E  E + T | T becomes E  T E’, E’  + T E’ | e
CS 540 Spring 2010 GMU

64 Non-Immediate Left Recursion
Ex: A1  A2 a | b A2  A1 c | A2 d Convert to immediate left recursion Substitute A1 in second set of productions by A1’s definition: A1  A2 a | b A2  A2 a c | b c | A2 d Eliminate recursion: A2  b c A3 A3  a c A3 | d A3 | e A1 A2 CS 540 Spring 2010 GMU

65 Example A B C A  B c | d B  C f | B f C  A e | g
Rewrite: replace C in B B  A e f | g f | B f Rewrite: replace A in B B  B c e f | d e f | g f | B f A B C CS 540 Spring 2010 GMU

66 Get rid of left recursion (and C if A is start) B  d e f B’ | g f B’
Now grammar is: A  B c | d B  B c e f | d e f | g f | B f C  A e | g Get rid of left recursion (and C if A is start) B  d e f B’ | g f B’ B’  c e f B’ | f B’ | e CS 540 Spring 2009 GMU

67 Error Recovery in LL parsing
Simple option: When see an error, print a message and halt “Real” error recovery Insert “expected” token and continue – can have a problem with termination Deleting tokens – for an error for non-terminal F, keep deleting tokens until see a token in follow(F). CS 540 Spring 2010 GMU

68 if (lookahead in {(,id} ) { T(); E_prime(); } E  T E’
For example: E() { if (lookahead in {(,id} ) { T(); E_prime(); } E  T E’ else { printf(“E expecting ( or identifier”); Follow(E) = $ ) while (lookahead != ) or $) lookahead = yylex(); } CS 540 Spring 2010 GMU

69 Real-World Compilers http://cs.gmu.edu/~white/CS540/parser.cpp
// CParser::ParseSourceModule is the “main” CS 540 Spring 2010 GMU


Download ppt "CS 540 George Mason University"

Similar presentations


Ads by Google