Re: Unicode Strings
Verfasst: 13.04.2013, 21:33
Richtige Frage! Niki?Artificial Mind hat geschrieben:Reden wir von UTF-8 als Enkodierung oder von Unicode als Zeichensatz?
Die deutsche Spieleentwickler-Community (seit 1999).
https://www.zfx.info/
Richtige Frage! Niki?Artificial Mind hat geschrieben:Reden wir von UTF-8 als Enkodierung oder von Unicode als Zeichensatz?
Wenn ich UTF-8 Lexer sage, dann meine ich damit, dass der eingehende Zeichenstrom UTF-8-kodiert ist. Ein Lexer fummelt sich zeichenweise durch den Strom und muss sich pro Zeichen oft die folgenden ein oder zwei Zeichen anschauen um ein Token erkennen zu können. Da ist eine Kodierung mit variablen Längen etwas störend. Hat man natürlich auch bei UTF-16, aber da ist es wesentlich überschaubarer.Artificial Mind hat geschrieben:Ok dann möchte ich auch sicher gehen: Was unterscheidet einen UTF8-Lexer von einem normalen Lexer?
Ich rede eigentlich schon die ganze Zeit von der Kodierung.Krishty hat geschrieben:Richtige Frage! Niki?Artificial Mind hat geschrieben:Reden wir von UTF-8 als Enkodierung oder von Unicode als Zeichensatz?
Gut, dann habe ich dich nicht missverstanden und bleibe bei meiner Aussage: das ist wesentlich einfacher als man vielleicht zuerst denkt. Insbesondere kann man der sehr schön als kleinen endlichen Automaten modellieren. Mir hilft es immer das anders herum zu betrachten: ich muss nicht in die Zukunft gucken sondern das Emittieren eines Zeichens verzögert sich potentiell um 4 chars.Niki hat geschrieben:Wenn ich UTF-8 Lexer sage, dann meine ich damit, dass der eingehende Zeichenstrom UTF-8-kodiert ist. Ein Lexer fummelt sich zeichenweise durch den Strom und muss sich pro Zeichen oft die folgenden ein oder zwei Zeichen anschauen um ein Token erkennen zu können. Da ist eine Kodierung mit variablen Längen etwas störend. Hat man natürlich auch bei UTF-16, aber da ist es wesentlich überschaubarer.Artificial Mind hat geschrieben:Ok dann möchte ich auch sicher gehen: Was unterscheidet einen UTF8-Lexer von einem normalen Lexer?
Code: Alles auswählen
case '/': // /, //, /*, /=
{
if (*p == '=')
{
p++;
EmitToken(p, TokenId_SlashEqual);
}
else if (*p == '/')
{
p++;
if (*p == '/')
{
p++;
SkipDocumentationComment(p);
}
else
{
SkipLineComment(p);
}
}
else if (*p == '*')
{
p++;
SkipBlockComment(p);
}
else
{
EmitToken(p, TokenId_Slash);
}
break;
}
Code: Alles auswählen
processUtf8Input(char c); // lies einzelne utf8 Zeichen ein und immer wenn eins komplett dekodiert werden kann wird processCodePoint mit dem dekodierten aufgerufen
processCodePoint(int c); // deine Funktion mit dem switch(c)
Das sieht nur so aus. Diese Variable "p" ist bei mir in etwa so definiert:Artificial Mind hat geschrieben:Dein switch-case nimmt ja einzelne chars an.
Code: Alles auswählen
const UTF16 *& p = m_pSourceCurrent;
Peek, Get und was noch alles habe ich früher immer benutzt. Heute benutze ich die nur noch im Parser. Ich finde das simple "p" einfacher, aber das merkt man erst wenn man's so benutzt. Der selben Auffassung scheint Microsoft übrigens auch zu sein (siehe C# Lexer in http://www.microsoft.com/en-us/download ... px?id=4917). Das soll jetzt übrigens nicht die Aussage "Wenn MS das so macht, dann ist es besser" sein. Soll rein informativ sein, falls es für jemanden interessant ist.Artificial Mind hat geschrieben:Gut, du hast die Vorwärst-Variante genommen. Da hilft es, sich eine "int currCodePoint()" und eine "nextCodePoint()" Funktion zu basteln. Auch "peek(int)"s sind recht beliebt.
Mein Lexer ist ein DFA. Fängt mit einem Zeichen an und fummelt sich bis zum Ende eines Tokens durch den Graphen.Artificial Mind hat geschrieben:Wenn du dir übrigens Compilerbau-Vorlesungen anguckst, dann werden Lexer meistens als endliche Automaten modelliert. Das von dir erwähnte Flex arbeitet beispielsweise auch mit DFAs (endlichen Automaten).
Ja, das sollte es in der Regel :) Viele Schwierigkeiten mit den Tokens liegen ja eh im Parser und nicht im Lexer. Zum Beispiel rauszufummeln ob >> nun ein Shift-Right-Operator ist, oder ob es zwei Klammern für das Ende eines geschachtelten Generics sind.Artificial Mind hat geschrieben:... und das funktionierte auch erstaunlich gut.