Syntax- oder Semantikfehler?
-
Hallo,
ich hatte mich an einer Diskussion beteiligt, in der es um die Frage ging ob es in folgendem Codefragment um einen Syntax- oder Semantikfehler geht:
int a; float b = 5.0; a = b; //oder auch int a = 5.0;
Ich hab irgendwann das Argument gebracht, dass es theoretisch ja möglich ist die Syntax so zu definieren, dass sie eindeutig ist und somit keine Semantik mehr benötigt werden würde. Ein Beispiel: Eine Zeitangabe im 24-Stunden-Format könnte man mit RegEx so definieren: \d\d:\d\d wobei \d eine Zahl von 0 bis 9
Dies wäre aber nicht eindeutig, da Angaben wie 37:71 erlaubt wären. Mit dem RegEx ([01]\d)|(2[0-3]):([0-5]\d) könnte man die Zahlenwerte einschränken und der Parser könnte eine gültige Zeitangabe erfassen - eine semantische Überprüfung wäre hier nicht mehr notwendig.
Nun kam aber das Argument, dass ein Statement wie int a = 5.0 die syntaktische Analyse des Compilers ohne Probleme durchlaufen würde, da die syntaktische Analyse gar keine Typen kennen würde (hier handelt es sich schließlich nicht nur um eine Zahlenangabe sondern auch um eine Zuweisung der Angabe an einen Typ).Stimmt das? Ist das also ein Semantik- und kein Syntaxfehler?
-
Meine Meinung: Es ist gar kein Fehler
-
Ok, die Programmiersprache in der es sich in der Diskussion gedreht hat war Java, in der das ein Fehler ist. Hab gerade festgestellt, dass der GCC dieses Konstrukt annimmt. Der GCC dürfte dieses Präzisionsverlust aber dennoch feststellen aber wann tut er das? Bei der semantischen oder der syntaktischen Analyse?
-
Unter der Vorraussetzung, dass du endliche (wenig) Typen hast, würde es durchaus möglich sein, sowas zu bauen, damit hast du dann aber keine Klassen. Mit Klassen wird es nahzu unmöglich sein (Klassen sind erst viel später bekannt), für alle möglichen Typen entsprechende Grammatikregeln in der Sprache zu definieren, die den Schema haben:
IntDecl = IntInit
StringDecl = StringInit
...Also diese Fehlerart lieber in Semantik prüfen lassen, dann ist es einheitlich und Grammtik wird nicht aufgebläht.
-
Antoras schrieb:
Ok, die Programmiersprache in der es sich in der Diskussion gedreht hat war Java, in der das ein Fehler ist. Hab gerade festgestellt, dass der GCC dieses Konstrukt annimmt. Der GCC dürfte dieses Präzisionsverlust aber dennoch feststellen aber wann tut er das? Bei der semantischen oder der syntaktischen Analyse?
Syntax und Semantik lassen sich bei C++ nicht wirklich gut trennen.
Ich würd das Thema bei Java belassen, wenn du Syntax/Semantik als zwei getrennte Phasen betrachten möchtest. Ich nehme an, dass es in Java ein Semantik-Fehler ist, denn die Java-Syntax lässt sich (AFAIK) eindeutig parsen ohne auf Typen zu achten.
-
Typsystem wuerde ich Syntax zuordnen. Dabei gibt der Typ nur das Was? an, nicht aber Wie? etwas ist. Somit ist es ein Syntaxfehler.
Wikipedia sagt dazu:
In computer science, a type system may be defined as "a tractable syntactic framework for classifying phrases according to the kinds of values they compute".
-
Es ist irgendwie beides und gleichzeitig auch wieder nicht und gleichzeitig eine Macke der Sprachkonstruktion.
Was irgendwie fehlt, ist ein Hinweiszeichen auf die Umwandlung. Und wenn man z.B. Video- und Sounddatentypen mischen würde, dann wäre das auch ziemlicher Unfug.
Z.B. Video = a
Soundwave(sync) = bund jetzt a = b? ziemlicher Quatsch.
also a(vi) >>>>>>>>>>>> b(Ss) oder ähnliches in der Richtung wäre vorstellbar.
Aber genau aus diesem Grund und anderen dieser Art hast du Assembler dreiviermal schneller gelernt als eine Hochsprache außer vielleicht Basic oder Haskell und so - denke ich mal...;)
-
Assembler dreiviermal schneller gelernt als ...
Hat nichts mit dem Problem zu tun. Trolle doch woanders!
-
knivil schrieb:
Assembler dreiviermal schneller gelernt als ...
Hat nichts mit dem Problem zu tun. Trolle doch woanders!
fass dich mal lieber an die eigene Nase und denk nochmal drüber nach.
-
Einfache Lösung: guck doch einfach in die Grammtik der Sprache, dann bekommst du eine definitive Antwort dazu. Und ich würde vermuten dass das in C++ ebensowenig ein Syntaxfehler sein soll wie in irgendeiner anderen Sprache, es sei denn mir zeigt jemand die entsprechende Stelle wo das in der Grammatik verboten wird.
-
Für mich ist der Code fehlerhaft bzw. falsch angeordnet, da wir die Variable a von der Variable b abhängig machen.
Damit der Codeabschnitt reibungslos funktioniert, müsste der Datentyp oder Klasse b kompatibel zum Datentyp oder Klasse von a sein.
-
in einigen frühen basic-Dialekten wurden die Bezeichner von String-Variablen mit einem angehängtem '' markiert, sodaß a="foo" falsch war, a="foo" korrekt.
Ebenso in frühem Fortran (implizite Typisierung): Variablen-Bezeichner, die mit i, j, k, l, m, oder n begannen, wurden implizit als Integer angenommen, wenn nichts Anderes angegeben war.
Solche Typfehler hätte ein Syntax-Checker finden können.
-
Dieser Thread wurde von Moderator/in nman aus dem Forum Themen rund um den PC in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
satanfreze schrieb:
Für mich ist der Code fehlerhaft bzw. falsch angeordnet, da wir die Variable a von der Variable b abhängig machen.
Der Code ist ja auch falsch. Ich will aber nicht wissen ob er es ist, sondern wann der Fehler vom Compiler entdeckt wird.
gastantwort schrieb:
Einfache Lösung: guck doch einfach in die Grammtik der Sprache, dann bekommst du eine definitive Antwort dazu.
Ich hab mal in der JLS nachgeguckt und nichts gefunden was genau festlegt, dass eine Integer Deklaration die Form int <name> = <integer_literal> haben muss.
Also kann man wohl sagen, dass es eben von der Grammatik und vor allem von deren Komplexität abhängt ob es sich hier um ein Syntax- oder Semantikfehler handelt?
-
Antoras schrieb:
Also kann man wohl sagen, dass es eben von der Grammatik und vor allem von deren Komplexität abhängt ob es sich hier um ein Syntax- oder Semantikfehler handelt?
Imho sind Typ-Fehler fast immer Semantik-Fehler. Die Abstract Syntax Trees werden oft in der Syntaxphase aufgebaut, danach werden die in der Semantikphase auf Korrektheit überprüft.
-
Antoras schrieb:
satanfreze schrieb:
Für mich ist der Code fehlerhaft bzw. falsch angeordnet, da wir die Variable a von der Variable b abhängig machen.
Der Code ist ja auch falsch. Ich will aber nicht wissen ob er es ist, sondern wann der Fehler vom Compiler entdeckt wird.
Der Compiler selbst dürfte eigentlich keinen Fehler, sondern nur eine Warnung ausgeben, da eine implizite Typkonvertierung durchgeführt wird.