errors in top-down parsing

Post on 10-Feb-2016

29 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Errors in Top-Down Parsing. Teoría de Autómatas y Lenguajes Formales M. Luisa González Díaz Universidad de Valladolid, 2005. type → simple | ^ simple | array [ simple ] of type simple → integer | char | num ptpt num. - PowerPoint PPT Presentation

TRANSCRIPT

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

top related