Date post: | 05-Apr-2015 |
Category: |
Documents |
Upload: | felicie-zahrt |
View: | 109 times |
Download: | 0 times |
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
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
4
Beispiele:
(C++)
int n = = 0; // Vergleich statt Zuweisungfloat f = 3.14, // fehlendes Ende der Deklaration ‘;‘if( n = = 5 n++; // Klammer ‘)‘ vergessen
5
Beispiele
#include <iostream.h>
int main(
{
int n == 5;
float f = 3.14,
cout < " n: " << n << endl;
cout << " f: " << f << endl;
return 0;
6
Compilermeldungen
Der Compiler
• erkennt syntaktische Fehler
• bricht nicht nach dem ersten Fehler ab
• gibt „entsprechende“ Fehlermeldungen aus
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.
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 | “_“ }...
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.
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
11
Beispiel: Syntaxbaumexpr
–
+expr
termexpr
term
term
digit
factor
factor
digit
factor
digit
2
9
5
9 + 2 – 5
12
Erläuterungen
Zielgerichtete Analyse / Top Down
• Zerlegung in Unterziele
• Die Unterziele rekursiv durchgehen
13
Rekursiver Abstieg
„Linksrekursion“ stellt Problem dar:
Bsp.: E ::= E + T | T
void E( ) {E( );Insymbol( ); // ‘+‘ ÜberlesenT( ); }
Nicht immer Behebung möglich!
14
Beispiel: fehlerhafter Ausdruck
2 Fehler : ersten gefunden, zweiten überlesen
if ( n == 5 n = 6,
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)
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.
17
Error Recovery
Beispiel: Modula-2 Quellprogramm
MODULE test;
BEGIN
IF (a = ] 1 write (a) END;
END test.
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‘
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
20
2. Falsche Symbole
• Bsp:
n = 15,• Falsches Symbol überlesen
• Bis zum nächsten First-Token lesen
21
Noch Fragen ?