Download - Errors in Top-Down Parsing
Errors in Top-Down Parsing
Teoría de Autómatas y Lenguajes FormalesM. Luisa González Díaz
Universidad de Valladolid, 2005
PPT integer char num array ^ [ of ] $
type rule 1 rule 1 rule 1 rule 3 rule 2
simple rule 4 rule 5 rule 6
type → simple | ^ simple | array [simple] of typesimple → integer | char | num ptpt num
type → simple | ^ simple | array [simple] of typesimple → integer | char | num ptpt num
PPT integer char num array ^ [ of ] $type rule 1 rule 1 rule 1 rule 3 rule 2
simple rule 4 rule 5 rule 6
A correct input:
array [ char ] of integer
type → simple | ^ simple | array [simple] of typesimple → integer | char | num ptpt num
array
type
] of typearray [ simple
[ Lex. An.
PPT integer char num array ^ [ of ] $type rule 1 rule 1 rule 1 rule 3 rule 2
simple rule 4 rule 5 rule 6
char
char
] of integer
simple
integer
$
$
Empty entries
type → simple | ^ simple | array [simple] of typesimple → integer | char | num ptpt num
array
type
] of typearray [ simple
Lex. An.
PPT integer char num array ^ [ of ] $type rule 1 rule 1 rule 1 rule 3 rule 2
simple rule 4 rule 5 rule 6
$
type → simple | ^ simple | array [simple] of typesimple → integer | char | num ptpt num
array
type
] of typearray [ simple
[ ^ Lex. An.
PPT integer char num array ^ [ of ] $type rule 1 rule 1 rule 1 rule 3 rule 2
simple rule 4 rule 5 rule 6
$
type → simple | ^ simple | array [simple] of typesimple → integer | char | num ptpt num
array
type
] of typearray [ simple
[ ^ Lex. An.
PPT integer char num array ^ [ of ] $type rule 1 rule 1 rule 1 rule 3 rule 2
simple rule 4 rule 5 rule 6
Error
$
char
type → simple | ^ simple | array [simple] of typesimple → integer | char | num ptpt num
array
type
] of typearray [ simple
[ ^ Lex. An.
PPT integer char num array ^ [ of ] $type rule 1 rule 1 rule 1 rule 3 rule 2
simple rule 4 rule 5 rule 6
char
char
] of integer
simple
integer
$
$
Other kind of empty entries
type → simple | ^ simple | array [simple] of typesimple → integer | char | num ptpt num
array
type
] of typearray [ simple
Lex. An.
PPT integer char num array ^ [ of ] $type rule 1 rule 1 rule 1 rule 3 rule 2
simple rule 4 rule 5 rule 6
$
type → simple | ^ simple | array [simple] of typesimple → integer | char | num ptpt num
array
type
] of typearray [ simple
[ Lex. An.
PPT integer char num array ^ [ of ] $type rule 1 rule 1 rule 1 rule 3 rule 2
simple rule 4 rule 5 rule 6
$
char
char
] of $
Error
type
type → simple | ^ simple | array [simple] of typesimple → integer | char | num ptpt num
PPT integer char num array ^ [ of ] $type rule 1 rule 1 rule 1 rule 3 rule 2
simple rule 4 rule 5 rule 6
Unexpected token:Mark error.Try again with the next token
Unexpected end of string:Mark error.Recognize we can’t expand non terminal
Panic mode
Code (panic mode)procedure type;
if lookahead = array thenmatch(array); match (‘[‘);simple; match(‘]‘); match(of); type
else if lookahead = ‘^’ thenmatch(‘^’); simple
else if lookahead in {char, integer, num} then simple
else if lookahead in {‘[‘,of, ‘]’} then writeln (‘Error:unexpected’, lookahead);match (lookahead); type
else (* lookahead = $ *)writeln (‘Error: I couldn’t find type’)
normal
errors
Match errors
type → simple | ^ simple | array [simple] of typesimple → integer | char | num ptpt num
array
type
] of typearray [ simple
[ Lex. An.
PPT integer char num array ^ [ of ] $type rule 1 rule 1 rule 1 rule 3 rule 2
simple rule 4 rule 5 rule 6
char
char
] of integer
simple
integer
$
$
char
Error
Other kind of match errors
type → simple | ^ simple | array [simple] of typesimple → integer | char | num ptpt num
array
type
] of type[ simplearray
Lex. An.
PPT integer char num array ^ [ of ] $type rule 1 rule 1 rule 1 rule 3 rule 2
simple rule 4 rule 5 rule 6
$
$
Error
match: panic mode
• lookahead = expected token (t) – OK: read next token into lookahead and return
• lookahead <> expected token (t)– mark error :unexpected token (t), but
• lookahead <> $– try again with the next token into lookahead
• lookahead = $– don’t try again, don’t read anymore, just return
Code of match (panic mode)procedure match (t: token);(*Pre: t <> $ * Never try to match end of string)begin
if lookahead = t thenlookahead := nexttoken (lexical analyzer)else if lookahead <> $ thenwriteln (‘Unexpected’, lookahead);lookahead := nexttoken;match (t)else (* lookahead = $ *)writeln (‘Unexpected end of string’)
end
type → simple | ^ simple | array [simple] of typesimple → integer | char | num ptpt num
array
type
] of type[ simplearray
Lex. An.
PPT integer char num array ^ [ of ] $type rule 1 rule 1 rule 1 rule 3 rule 2
simple rule 4 rule 5 rule 6
$
$
Error
[
Error
simple ]
Error
of
Error Error
type
Main program
Beginlookahead = nexttoken;type; if lookahead = $ theninput finished (errors, if any, were marked)elseunexpected input after end of type
End.
PPT integer char num array ^ .. [ of ] $
type rule 1 rule 1 rule 1 rule 3 rule 2
simple rule 4 rule 5 rule 6 er
type → simple | ^ simple | array [simple] of typesimple → integer | char | num ptpt num
An example of phrase-level error-recovery strategy
Suposse it’s quite usual forgeting first number in num ptpt num
Error action : mark it was forgotten
Code (panic+phrase-level mode)procedure simple;
if lookahead = integer then match(integer); else if lookahead = char then match(char);
else if lookahead = num then match(num); match(ptpt); match(num);
else if lookahead in {array, ‘^’, ‘[‘, of, ‘]’} then writeln (‘Error:unexpected’, lookahead);match (lookahead); simple
else if lookahead = ptpt thenwriteln (‘Error: forgotten num’);match(ptpt); match(num);
else (* lookahead = $ *)writeln (‘Error: I couldn’t find simple’)
normal
errors