21
1 Syntaktische Fehler I Ein Vortrag von Stefan Winter & Marc Ruppert

1 Syntaktische Fehler I Ein Vortrag von Stefan Winter & Marc Ruppert

Embed Size (px)

Citation preview

Page 1: 1 Syntaktische Fehler I Ein Vortrag von Stefan Winter & Marc Ruppert

1

Syntaktische Fehler I

Ein Vortrag von Stefan Winter & Marc Ruppert

Page 2: 1 Syntaktische Fehler I Ein Vortrag von Stefan Winter & Marc Ruppert

2

Was sind syntaktische Fehler ?

Syntax (griech. syntaxis: Zusammenordnung, Lehre vom Satzbau):

Eine Sprache wird durch eine Folge von Zeichen, die nach bestimmten Regeln aneinandergereiht werden dürfen, definiert. Den hierdurch beschriebenen Aufbau der Sätze oder Wörter, die zur Sprache gehören, bezeichnet man als ihre Syntax.

=> Syntaktischer Fehler = grammatikalische Unkorrektheit

Page 3: 1 Syntaktische Fehler I Ein Vortrag von Stefan Winter & Marc Ruppert

3

Ist die Syntax so wichtig?

Beispiel:

syntax griech syntaxis zusammenordnung lehre vom satzbau einer sprache wird durch eine folge von zeichen die nach bestimmten regeln aneinandergereiht werden dürfen definiert den hierdurch beschriebenen aufbau der sätze oder wörter die zur sprache gehören bezeichnet man als ihre syntax

Page 4: 1 Syntaktische Fehler I Ein Vortrag von Stefan Winter & Marc Ruppert

4

Beispiele:

(C++)

int n = = 0; // Vergleich statt Zuweisungfloat f = 3.14, // fehlendes Ende der Deklaration ‘;‘if( n = = 5 n++; // Klammer ‘)‘ vergessen

Page 5: 1 Syntaktische Fehler I Ein Vortrag von Stefan Winter & Marc Ruppert

5

Beispiele

#include <iostream.h>

int main(

{

int n == 5;

float f = 3.14,

cout < " n: " << n << endl;

cout << " f: " << f << endl;

return 0;

Page 6: 1 Syntaktische Fehler I Ein Vortrag von Stefan Winter & Marc Ruppert

6

Compilermeldungen

Der Compiler

• erkennt syntaktische Fehler

• bricht nicht nach dem ersten Fehler ab

• gibt „entsprechende“ Fehlermeldungen aus

Page 7: 1 Syntaktische Fehler I Ein Vortrag von Stefan Winter & Marc Ruppert

7

Behandlung gefundener Fehler

Ziele der Fehlerbehandlung

1. Möglichst viele Fehler in einem Durchlauf erkennen

2. Die Analyse von fehlerfreiem Code sollnicht behindert werden

3. Der Parser soll nicht unnötig „aufgebläht“ werden.

Page 8: 1 Syntaktische Fehler I Ein Vortrag von Stefan Winter & Marc Ruppert

8

Syntaktische Analyse (parsing)

In einem Übersetzer hat die syntaktische Analyse die Funktion, ein Quellprogramm, dargestellt als Folge von Token, in einen Ableitungsbaum zu übertragen.

Bsp.: GdI I PraktikumStatement ::= ... | Block | VariableDefinitionVariableDefinition ::= “int“ | “boolean“ | ...Identifier ::= Letter { Letter | Digit | “_“ }...

Page 9: 1 Syntaktische Fehler I Ein Vortrag von Stefan Winter & Marc Ruppert

9

Der „Zerteiler“

Anforderungen an einen Parser

Ein Parser liest die zum Quellprogramm gehörende Tokenfolge ein, meldet eventuelle Fehler und gibt den dazugehörigen Ableitungsbaum aus.

Page 10: 1 Syntaktische Fehler I Ein Vortrag von Stefan Winter & Marc Ruppert

10

Bsp.: Arithmetischer Ausdruck

EBNF eines arithmetischen Ausdrucks

expr ::= expr + term | expr – term | termterm ::= term * factor | term / factor | factorfactor ::= digit | ( expr )

Arithmetischer Ausdruck: 9 + 2 – 5

Page 11: 1 Syntaktische Fehler I Ein Vortrag von Stefan Winter & Marc Ruppert

11

Beispiel: Syntaxbaumexpr

+expr

termexpr

term

term

digit

factor

factor

digit

factor

digit

2

9

5

9 + 2 – 5

Page 12: 1 Syntaktische Fehler I Ein Vortrag von Stefan Winter & Marc Ruppert

12

Erläuterungen

Zielgerichtete Analyse / Top Down

• Zerlegung in Unterziele

• Die Unterziele rekursiv durchgehen

Page 13: 1 Syntaktische Fehler I Ein Vortrag von Stefan Winter & Marc Ruppert

13

Rekursiver Abstieg

„Linksrekursion“ stellt Problem dar:

Bsp.: E ::= E + T | T

void E( ) {E( );Insymbol( ); // ‘+‘ ÜberlesenT( ); }

Nicht immer Behebung möglich!

Page 14: 1 Syntaktische Fehler I Ein Vortrag von Stefan Winter & Marc Ruppert

14

Beispiel: fehlerhafter Ausdruck

2 Fehler : ersten gefunden, zweiten überlesen

if ( n == 5 n = 6,

Page 15: 1 Syntaktische Fehler I Ein Vortrag von Stefan Winter & Marc Ruppert

15

First- & Follow- Mengen

Idee:

Entscheidung, welche Produktion anzuwenden ist, ist abhängig vom ersten Token der Produktion (FIRST), bzw. bei gleichen FIRST-Token vom darauf folgenden Token (FOLLOW)

Page 16: 1 Syntaktische Fehler I Ein Vortrag von Stefan Winter & Marc Ruppert

16

Error Recovery

• Jede fehlerhafte Eingabe wird vom Parser in eine syntaktisch korrekte umgewandelt.

• So kann der Parser trotz eines Fehlers den nachfolgenden Code analysieren.

• Während der Umwandlung: Repair-Mode: Es werden keine Token gelesen, aber eine minimale Sequenz von Token wird verändert/erstellt, um den Fehler zu beheben.

Page 17: 1 Syntaktische Fehler I Ein Vortrag von Stefan Winter & Marc Ruppert

17

Error Recovery

Beispiel: Modula-2 Quellprogramm

MODULE test;

BEGIN

IF (a = ] 1 write (a) END;

END test.

Page 18: 1 Syntaktische Fehler I Ein Vortrag von Stefan Winter & Marc Ruppert

18

Error Recovery

Fehlermeldungen:3, 12: Error syntax error3, 12: Information expected symbols:

Ident Integer Real String‘(‘ ‘+‘ ‘–‘ ‘{‘ ‘NOT‘

3, 14: Information restart point3, 16: Error syntax error3, 16: Information restart point3, 16: Repair symbol inserted : ‘)‘3, 16: Repair symbol inserted : ‘THEN‘

Page 19: 1 Syntaktische Fehler I Ein Vortrag von Stefan Winter & Marc Ruppert

19

1. Fehlende Symbole

if ( n = = 5 n + +;

• fehlende Klammer festgestellt

• fehlendes Symbol vielleicht zu spät erkannt

• fehlt das Symbol oder eines zu viel ?

• Nicht feststellbar, da Infos verworfen

Page 20: 1 Syntaktische Fehler I Ein Vortrag von Stefan Winter & Marc Ruppert

20

2. Falsche Symbole

• Bsp:

n = 15,• Falsches Symbol überlesen

• Bis zum nächsten First-Token lesen

Page 21: 1 Syntaktische Fehler I Ein Vortrag von Stefan Winter & Marc Ruppert

21

Noch Fragen ?