Syntaktik und Semantik

Gast
Gast

Re: Syntaktik und Semantik

Beitrag von Gast » 9. Mär 2014 15:54

Gibt es außer vergessenem Semikolon und vergessener Klammer (oder beispielsweise Trennung der Angaben im Kopf der for-Schleife durch Komma statt durch Semikolon) überhaupt andere syntaktische Fehler? Oder lässt sich platt behaupten: Jeder Fehler, der nicht durch vergessene Klammer oder Semikolon hervorgerufen wurde, ist semantischer Art?
Und wie sind falsch geschriebene Schlüsselwörter zu interpretieren?

Benutzeravatar
SophiaLi1
Kernelcompilierer
Kernelcompilierer
Beiträge: 542
Registriert: 5. Jan 2014 11:48

Re: Syntaktik und Semantik

Beitrag von SophiaLi1 » 9. Mär 2014 16:20

Falsch geschriebene Schlüsselwörter sind Syntaxfehler. Genauso ist es ein Syntaxfehler, wenn ein Bezeichnet mit einer Ziffer beginnt.

topracer
Mausschubser
Mausschubser
Beiträge: 53
Registriert: 10. Jan 2014 19:14

Re: Syntaktik und Semantik

Beitrag von topracer » 9. Mär 2014 16:57

Vielleicht könnte mir noch mal jemand bestätigen, ob ich das dann bei dem AI1-Quiz Aufgabe 2 c) richtig sehe (denn in der ML wird die Art des Fehlers nicht benannt):

Der einzige semantische Fehler ist in Zeile 4 (die for-Schleife mit der IndexOutOfBoundsException), die anderen drei Fehler sind allesamt syntaktische?

Gast
Gast

Re: Syntaktik und Semantik

Beitrag von Gast » 9. Mär 2014 18:33

Studentin hat geschrieben:Eine Einrückung ist ja eigentlich nur eine Vielzahl von Leerzeichen und somit für die fehlerfreie ausführung des Programmcodes unerheblich, d.h. kein Syntaxfehler. Durch fehlende Einrückungen leidet die Übersichtlichkeit, mehr nicht.
Kommt auf die Programiersprache an....es gibt da so eine von ein par Exzentrikern entwickelte Programierprache namens Python :/

PhK
Gast

Re: Syntaktik und Semantik

Beitrag von PhK » 9. Mär 2014 19:19

Wie sieht es mit einem Compilerfehler "variable xy might not have been initalized" aus?
Soetwas bekomme ich nicht kompiliert, außer f wird als final deklariert. (Aus Compilersicht verständlich, ist das dann ein Syntaktischer Fehler, wenn der Compiler aus Vorsicht nicht kompiliert?)

Code: Alles auswählen

    public static void test3(){
        int f = 1;
        int i;
        if(f==1){
            i=0;
        }
        i++;
        System.out.println(i);
    }

Benutzeravatar
SophiaLi1
Kernelcompilierer
Kernelcompilierer
Beiträge: 542
Registriert: 5. Jan 2014 11:48

Re: Syntaktik und Semantik

Beitrag von SophiaLi1 » 9. Mär 2014 19:45

Prof. Karsten Weihe hat geschrieben: "Syntaxfehler findet und moniert der Compiler. Semantikfehler findet der Compiler nicht, sondern sie wirken sich zur Laufzeit durch Programmabbruch aus."
Demnach ist eine Variable, die ich verwenden möchte, aber vorher nicht deklariert habe, ein syntaktischer Fehler, weil das der Compiler erkennt?

midstar
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 172
Registriert: 29. Dez 2013 17:00

Re: Syntaktik und Semantik

Beitrag von midstar » 10. Mär 2014 02:49

Ich möchte an der Stelle nochmal zu vorher eingreifen.

mmi1991 schrieb:
String a = "Hallo";
int b=a;

Sollte ein Syntaxfehler sein, wenn man jetzt aber eine korrekte typenumwandlung hätte, und dann den wert zuweisen würde, wäre es wieder ein Semantischer fehler, oder nicht?

Ja ich denke die for-Schleife ist der einzige Semantische Fehler. und ja auch eine nicht deklarierte variable ist ein Syntaxfehler, denn es wird bei Ignorierung einfach kein Wert zugewiesen, weil sie nicht existiert. Was nicht existiert zieht Syntaxfehler nach sich <- wäre meiner erklärung

@Phk, wenn du das programm als jar-datei exportierst, und laufen lässt, und bewusst keinen Fehler erzeugst wirst du keine unstimmigkeit im Programm finden (also keinen logischen Fehler) behaupte ich, damit fällt es per Ausschlussverfahren in den Bereich der Syntax.

Prof. Karsten Weihe
Dozentin/Dozent
Beiträge: 1824
Registriert: 21. Feb 2005 16:33

Re: Syntaktik und Semantik

Beitrag von Prof. Karsten Weihe » 10. Mär 2014 09:48

Studentin hat geschrieben:Eine Einrückung ist ja eigentlich nur eine Vielzahl von Leerzeichen und somit für die fehlerfreie ausführung des Programmcodes unerheblich, d.h. kein Syntaxfehler. Durch fehlende Einrückungen leidet die Übersichtlichkeit, mehr nicht.
Korrekt.

Kleine Zusatzanmerkung: Es gibt auch Situationen, in denen ein fehlendes Leerzeichen ein Fehler wäre, etwa zwischen Typnamen und Variablen:

int n;

Das Leerzeichen darf in dieser Zeile natürlich nicht ersatzlos fehlen. "Nicht ersatzlos" heißt: Anstelle des Leerzeichens dürfte jeder andere Whitespace stehen, bspw. auch ein Tabulator oder ein Zeilenumbruch. Und natürlich auch eine beliebige Sequenz aus Whitespaces.

KW

Puffryze
Gast

Re: Syntaktik und Semantik

Beitrag von Puffryze » 10. Mär 2014 10:01

Teilt euch es einfach so auf:

Alle! Alle Fehler die vom Compiler angemeckert werden sind Syntaxfehler! (Wer beim Praktikum mitgemacht hat, hat sie schon genüge zu Gesicht bekommen)


Semantikfehler:
Werden nie vom Compiler erkannt! Das sind die ganzen Runtime Exceptions, die zum Programmabbruch führen
- ArithmeticException (Division by 0)
- ArrayIndexOutOfBoundsException (Index im minus Bereich)
- NullPointerException (null Referenz wird abgefragt)
- IllegalArgumentException

Die anderen Runtimes haben wir nie wirklich behandelt ... also ist das eig alles

dafür stehe ich mit meinem Namen :P

midstar..
Gast

Re: Syntaktik und Semantik

Beitrag von midstar.. » 10. Mär 2014 11:33

Semantikfehler werden nie erkannt?

Ein guter Compiler erkennt ein ArrayIndexOutOfBounds, ist es somit ein Syntaxfehler??

Prof. Karsten Weihe
Dozentin/Dozent
Beiträge: 1824
Registriert: 21. Feb 2005 16:33

Re: Syntaktik und Semantik

Beitrag von Prof. Karsten Weihe » 10. Mär 2014 11:49

midstar.. hat geschrieben:Semantikfehler werden nie erkannt?
Ein guter Compiler erkennt ein ArrayIndexOutOfBounds, ist es somit ein Syntaxfehler??
Sie sehen, wie schwierig es ist, eine Unterscheidung exakt zu formulieren, wenn man nicht eine Grammatik zugrundelegt, was in der AI1 aber viel zu weit führen würde. Eine ärgerliche Gratwanderung...

Zu Ihren konkreten Punkt: Nur in ganz speziellen Fällen hat der Compiler eine Chance, ein ArrayIndexOutOfBounds zu entdecken, nämlich wenn der Fehler zur Kompilierzeit ohne jeden Zweifel erkennbar ist. Hängt der Index hingegen von Informationen ab, die erst zur Laufzeit bekannt sind - bspw. Benutzereingaben oder Inhalt einer Datei -, dann kann der Compiler nicht vorhersagen, ob ein ArrayIndexOutOfBounds passieren wird oder nicht.

KW

Puffryze
Gast

Re: Syntaktik und Semantik

Beitrag von Puffryze » 10. Mär 2014 11:58

Code: Alles auswählen

public class Semantikfehler
{
    double[] a = new double[10];
            
    /**
     * Constructor for objects of class taaddel
     */
    public Semantikfehler()
    {
     a[0] = 23.3;
     a[1] = 22.2; 
     a[-2] = 33.3; 
     a[10] = 123131;
     this.a = a;
    }    
    
    public void ausfuehren(){
    System.out.println(a[-2]); 
  }  
}
Also wenn ich das hier in BlueJ eintippe, dann führt der Compiler das ohne Murren aus. Und bei Programmstart wirft er die Exception...

welches Programm hat denn diesen guten Compiler ?
Weil viel offensichtlicher kann ich es dem Compiler nicht machen...

LG

Benutzeravatar
aDramaQueen
Mausschubser
Mausschubser
Beiträge: 84
Registriert: 10. Jan 2014 16:34

Re: Syntaktik und Semantik

Beitrag von aDramaQueen » 10. Mär 2014 20:02

Hättest evtl. ja ne neue Subklasse für Arrays schreiben können die auch mit negativen Indizes umgehen könnte...
Bild
...Never go full retard...

Gast
Gast

Re: Syntaktik und Semantik

Beitrag von Gast » 10. Mär 2014 20:52

Prof. Karsten Weihe hat geschrieben:
midstar.. hat geschrieben:Semantikfehler werden nie erkannt?
Ein guter Compiler erkennt ein ArrayIndexOutOfBounds, ist es somit ein Syntaxfehler??
Sie sehen, wie schwierig es ist, eine Unterscheidung exakt zu formulieren, wenn man nicht eine Grammatik zugrundelegt, was in der AI1 aber viel zu weit führen würde. Eine ärgerliche Gratwanderung...

Zu Ihren konkreten Punkt: Nur in ganz speziellen Fällen hat der Compiler eine Chance, ein ArrayIndexOutOfBounds zu entdecken, nämlich wenn der Fehler zur Kompilierzeit ohne jeden Zweifel erkennbar ist. Hängt der Index hingegen von Informationen ab, die erst zur Laufzeit bekannt sind - bspw. Benutzereingaben oder Inhalt einer Datei -, dann kann der Compiler nicht vorhersagen, ob ein ArrayIndexOutOfBounds passieren wird oder nicht.

KW
Komplett sauber betrachtet geht die Aufteilung noch weiter....

aka Lexer meckert rum -> Lexikalischer Fehler
Parser sagt nein -> Syntaktischer Fehler
Typsystem sagt nein oder (idealerweise tritt das nicht ein Laufzeitfehler) -> Semantischer Fehler

wie schon gesagt braucht man um das zu unterscheiden zu können einen einblick in die grammatik, den lexer+parser, eventuel noch das Typsystem, was
definitiv zu weit geht für ai1.

In der jetztigen Definition wird ein Compilerfehler als syntaktischer Fehler und alles andere als semantischer Fehler bezeichnet. Wir haben gesehen das diese Definition problematisch ist, da sie bekannten Lehrbüchern widerspricht.

Mein Verbesserungsvorschlag zum nächsten mal wäre daher, das man sich vielleicht von dem Begriff syntax/semantik löst und stattdessen von Compiletime-error bzw Runtime-error reded. Durch diese kleine Änderung der Begrifflichkeiten hat man garnicht erst das Problem, dass man sich mit der Definition von Syntax/Semantik herumprügeln muss.

mfg

Gast
Gast

Re: Syntaktik und Semantik

Beitrag von Gast » 11. Mär 2014 10:42

Hallo,
ich kann bei meiner Methode in der Signatur angeben, dass sie eine Exception wirft, sie aber im Rumpf nicht werfen. Ein Compilerfehler wäre das ja auf keinen Fall, aber ist es ein semantischer Fehler? Es führt ja auch nicht zum Programmabbruch. Ist so etwas überhaupt ein Fehler oder fällt das in die Kategorie "verwirrt denjenigen, der den Code liest, ist aber kein Fehler"?

LG

Antworten

Zurück zu „Archiv“