Dennis wrote:
> Wo liegt denn da der Fehler?
In GCC's Parser für Zahlen. Der Lexer besitzt nur einen einzigen
Parser, der sowohl für Integer- als auch Float-Zahlen benutzt wird.
Die Unterscheidung zwischen beiden erfolgt erst im Parser selbst, also
nachdem die Tokens bereits sortiert sind. Dass das so gelöst ist,
dürfte mit dem Kozept einer `preprocessing number' zusammenhängen, die
ein zentraler Bestandteil der C-Syntax ist (Zahlen müssen bereits im
Präprozessor erkannt werden, nicht erst im Compiler):
6.4.8 Preprocessing numbers
...
Semantics
4 A preprocessing number does not have type or a value; it acquires
both after a successful conversion (as part of translation phase 7)
to a floating constant token or an integer constant token.
Allerdings hat das Ganze einen Bug: der Substring
0x4E+0x23
wird als ein Token erkannt, da es mittlerweile ja auch hexadezimale
Gleitkommakonstanten gibt. (Deren Vorteil ist die exakte Darstellung,
bei der es keine Rundungsfehler gibt.) Die Fehlinterpretation rührt
aus dem ,E' in 0x4E her, das von einem Vorzeichen gefolgt wird, damit
also ein gültiger Exponent sein kann. Da der Lexer noch nicht nach
Integer- und Gleitkomma unterscheidet, sortiert er die komplette 0x23
nach dem E+ als zur Zahl zugehörig. Der Parser stellt dann fest, dass
der mit e eingeleitete Exponent nicht zu einer hexadezimalen
Gleitkommakonstanten passt, und sortiert den ersten Teil der Zahl als
Integerkonstante. Damit ist dann aber der verbleibende Teil +0x23
nicht mehr passend, und der Bug triggert.
Ich weiß gar nicht, ob es dafür schon einen Bugreport gibt, wenn
nicht, dann schreib einen.
Den Bug kannst du übrigens einfach umgehen: schreib Leerzeichen um die
Pluszeichen (hattest du ja schon bemerkt).