Opérations évoluées sur un flux d'entrée. More...
#include "cogitant/iomisc.h"
Classes | |
class | Lexeme |
Lexème reconnu par la classe IStream. More... | |
Public Types | |
typedef unsigned long | Line |
Numérotation des lignes. More... | |
typedef unsigned int | LexemeType |
Type de Lexeme. More... | |
Public Member Functions | |
IStream () | |
Constructeur. More... | |
virtual | ~IStream () |
Destructeur. More... | |
virtual void | setStream (std::istream *is, std::string const &sn="") |
Assignation du flux de lecture. More... | |
Line | line () const |
Accès à la ligne courante. More... | |
Line | column () const |
Accès à la colonne courante. More... | |
Encoding::Type | encoding () const |
Type d'encodage du flux. More... | |
std::string const & | streamName () const |
Nom du flux. More... | |
std::istream const * | stream () const |
Accès direct au flux. More... | |
virtual bool | init (Encoding::Type st=Encoding::DEFAULT) |
Initialisation du flux. More... | |
void | setCompressed (unsigned long decosize) |
Passage en mode compressé. More... | |
virtual bool | isSeparator (wchar_t c) |
Le caractère est-il un séparateur dans le format. More... | |
virtual bool | isSpecialChar (wchar_t c) |
Le caractère est-il un caractère spécial dans le format. More... | |
virtual LexemeType | isKeyword (std::string const &s) |
La chaîne passée est-elle un mot clef du format. More... | |
virtual void | handleCharAfterEscapeChar (wchar_t c, std::string &result) |
Gère le caractère lu juste après un caractère d'échappement. More... | |
virtual void | readString (std::string &s) |
Lecture d'une chaîne jusqu'au prochain séparateur. More... | |
virtual bool | readStringQuote () const |
La précédente lecture de chaine était elle entre guillemets ou pas. More... | |
virtual bool | isQuoteChar (wchar_t c, bool begin) const |
Le caractère passé est-il le caractère d'ouverture de guillements utilisé par readString(). More... | |
virtual bool | isEscapeChar (wchar_t c) |
Le caractère est-il le caractère d'échappement. More... | |
virtual bool | isBlankChar (wchar_t c) |
Le caractère doit il être ignoré. More... | |
virtual wchar_t | getChar () |
Lecture d'un caractère sans aucune interprétation. More... | |
virtual wchar_t | nextChar () |
Lecture d'un caractère sans aucune interprétation et passage au caractère suivant. More... | |
virtual void | ignoreChar () |
Passage au caractère suivant dans le flux. More... | |
virtual void | ignoreChars (unsigned long ign) |
Ignorer plusieurs caractères dans le flux. More... | |
void | readBytes (unsigned char *c, unsigned int lg) |
Lecture brute d'octets. More... | |
bool | eof () const |
Fin du flux de lecture atteinte. More... | |
std::streampos | tellg () const |
Position actuelle dans le flux. More... | |
void | memoPosition () |
Mémorisation d'une position. More... | |
void | backToMemoPosition () |
Retour à la position mémorisée. More... | |
virtual void | readLexeme (Lexeme &l) |
Lecture de l'unité lexicale suivante. More... | |
void | addComment (std::string const &b, std::string const &e) |
Ajout d'un couple de chaînes de caractères délimitant un commentaire. More... | |
void | addComment (std::vector< wchar_t > const &b, std::vector< wchar_t > const &e) |
Ajout d'un couple de chaînes de caractères délimitant un commentaire. More... | |
void | deleteComments () |
Supprime tous les couples de commentaires déja définis. More... | |
void | setIgnoreComments (bool ic) |
Ignorer les marques de début/fin de commentaires. More... | |
void | stringAddChar (std::string &s, wchar_t c) const |
Ajoute à une chaîne un caractère en convertissant ce caractère si nécessaire. More... | |
std::string const * | stringConvert (std::string const &s, std::string &result) |
Convertit la chaîne si le mode de conversion d'encodage est EC_STRING. More... | |
void | setEncoding (Encoding::Type nt, bool autoutf8=false) |
Modifie l'encodage du flux. More... | |
void | setReadBom (bool rb) |
Modifie la lecture du BOM. More... | |
virtual std::string | lexemeToString (Lexeme const &l) |
Convertit le lexème en chaîne de caractères représentant le lexème. More... | |
void | throwException (Lexeme const &found, Lexeme const &expected1, Lexeme const &expected2=Lexeme(), Lexeme const &expected3=Lexeme(), Lexeme const &expected4=Lexeme(), Lexeme const &expected5=Lexeme()) |
Lever une exception d'analyse syntaxique. More... | |
LexemeType | verifyLexeme (Lexeme const &s, LexemeType l1, wchar_t sc1=0, LexemeType l2=LEX_UNKNOWN, wchar_t sc2=0, LexemeType l3=LEX_UNKNOWN, wchar_t sc3=0, LexemeType l4=LEX_UNKNOWN, wchar_t sc4=0, LexemeType l5=LEX_UNKNOWN, wchar_t sc5=0) |
Vérifie si le lexeme passé fait partie des types de lex§mes donnés. | |
LexemeType | assertLexeme (Lexeme &s, LexemeType l1, wchar_t sc1=0, LexemeType l2=LEX_UNKNOWN, wchar_t sc2=0, LexemeType l3=LEX_UNKNOWN, wchar_t sc3=0, LexemeType l4=LEX_UNKNOWN, wchar_t sc4=0, LexemeType l5=LEX_UNKNOWN, wchar_t sc5=0) |
Lit le lexème suivant qui doit être d'un des types donnés. More... | |
LexemeType | verifyLexeme (Lexeme const &s, LexemeType ltypes[], wchar_t lchars[]) |
Vérifie si le lexème est d'un des types donnés. More... | |
LexemeType | assertLexeme (Lexeme &s, LexemeType ltypes[], wchar_t lchars[]) |
Lit le lexème suivant qui doit être d'un des types donnés. More... | |
Static Public Attributes | |
static const LexemeType | LEX_UNKNOWN |
Lexème non défini ou en erreur. More... | |
static const LexemeType | LEX_SPECIALCHAR |
Un caractère spécial dans le format interprété : son code est dans m_char. More... | |
static const LexemeType | LEX_EOF |
La marque de fin de fichier. More... | |
static const LexemeType | LEX_STRING |
Un identificateur : une chaîne dans m_string. More... | |
Protected Types | |
enum | EncodingConvert { EC_NONE, EC_CHAR, EC_STRING } |
Conversion d'encodage actuellement utilisée. More... | |
Protected Member Functions | |
unsigned char | streamGet () |
Simulation de la méthode get() sur le flux. More... | |
unsigned char | streamPeek () |
Simulation de la méthode peek() sur le flux. More... | |
wchar_t | streamGetChar () |
Lecture du prochain caractère du flux, en utilisant un décodage Utf16. More... | |
wchar_t | streamPeekChar () |
Accès au prochain caractère du flux, en utilisant un décodage Utf16. More... | |
void | streamRead (unsigned char *buf, unsigned int lg) |
Simulation de la méthode read() sur le flux. More... | |
std::streampos | length () |
Longueur du flux. More... | |
Protected Attributes | |
std::istream * | m_stream |
Flux de lecture. | |
std::string | m_streamname |
Nom du flux. | |
Line | m_line |
Ligne en cours de lecture. | |
Line | m_column |
Position en cours de lecture dans la ligne. More... | |
std::streampos | m_memopos |
Mémorisation d'une position dans le flux. | |
Line | m_memoposline |
Ligne de la position mémorisée. | |
Line | m_memoposcolumn |
Colonne de la position mémorisée. | |
bool | m_readstringquote |
Lecture de guillemets lors de la dernière lecture de chaine. | |
std::vector< std::vector< wchar_t > > | m_commentbegin |
Chaines de début de comentaires. More... | |
std::vector< std::vector< wchar_t > > | m_commentend |
Chaines de fin de commentaire. More... | |
bool | m_ignorecomments |
Ignorer les marques de commentaires. More... | |
std::queue< wchar_t > | m_queuechar |
Caractères lus mais qui doivent être interprétés à nouveau. More... | |
Encoding::Type | m_encoding |
Type d'encodage du flux. More... | |
bool | m_autoutf8 |
Passage automatique d'un encodage Utf-8 à un encodage Latin9. More... | |
bool | m_readbom |
Si défini à vrai (par défaut) tente de lire le BOM en début de flux pour déterminer l'encodage. More... | |
bool | m_compressed |
Compression. More... | |
unsigned char * | m_decobuffer |
Buffer utilisé pour la décompression. More... | |
unsigned long | m_decobuffersize |
Taille du buffer de décompression. More... | |
unsigned long | m_decobufferpos |
Position de lecture dans le buffer de décompression. More... | |
EncodingConvert | m_econvert |
Conversion d'encodage. More... | |
Opérations évoluées sur un flux d'entrée.
Cette classe offre des fonctionnalités de lecture sur un flux qui permettent de lire ce flux de façon plus simple que dans le cas de l'utilisation de ifstream
.
typedef unsigned int cogitant::IStream::LexemeType |
Type de Lexeme.
D'autres types de lexèmes peuvent être définis, par exemple pour les mots-clefs du langage analysé. Ils doivent être définis par des constantes strictement supérieures à STRING.
typedef unsigned long cogitant::IStream::Line |
Numérotation des lignes.
|
protected |
cogitant::IStream::IStream | ( | ) |
Constructeur.
|
virtual |
Destructeur.
void cogitant::IStream::addComment | ( | std::string const & | b, |
std::string const & | e | ||
) |
Ajout d'un couple de chaînes de caractères délimitant un commentaire.
b | début de la zone de commentaires. |
e | fin de la zone. |
void cogitant::IStream::addComment | ( | std::vector< wchar_t > const & | b, |
std::vector< wchar_t > const & | e | ||
) |
Ajout d'un couple de chaînes de caractères délimitant un commentaire.
b | début de la zone de commentaires. |
e | fin de la zone. |
|
inline |
Lit le lexème suivant qui doit être d'un des types donnés.
Si le lexème suivant n'est pas l1, l2, l3 ou l4 ou l5, appelle throwException(). Les valeurs de li égales à LEX_UNKNOWN ne sont pas prises en compte. Pour des raisons de performance (car elle est appelée très souvent), cette méthode prend comme paramètre des couples LexemeType, wchar_t plutôt que des Lexeme, ce qui interdit son utilisation pour imposer un lexeme LEX_STRING particulier.
s | (R) lexeme lu. |
l1 | lexeme suivant possible (type). |
sc1 | lexeme suivant possible (caractère spécial, uniquement utilisé si l1 == LEX_SPECIALCHAR). |
l2 | lexeme suivant possible (type). |
sc2 | lexeme suivant possible (caractère spécial, uniquement utilisé si l2 == LEX_SPECIALCHAR). |
l3 | lexeme suivant possible (type). |
sc3 | lexeme suivant possible (caractère spécial, uniquement utilisé si l3 == LEX_SPECIALCHAR). |
l4 | lexeme suivant possible (type). |
sc4 | lexeme suivant possible (caractère spécial, uniquement utilisé si l4 == LEX_SPECIALCHAR). |
l5 | lexeme suivant possible (type). |
sc5 | lexeme suivant possible (caractère spécial, uniquement utilisé si l5 == LEX_SPECIALCHAR). |
|
inline |
Lit le lexème suivant qui doit être d'un des types donnés.
s | (R) lexeme lu. |
ltypes | tableau de types de lexèmes autorisés (terminé par LEX_UNKNOWN). |
lchars | tableau de caractères spéciaux autorisés, associés aux LEX_SPECIALCHAR de types. |
void cogitant::IStream::backToMemoPosition | ( | ) |
Retour à la position mémorisée.
Line cogitant::IStream::column | ( | ) | const |
Accès à la colonne courante.
void cogitant::IStream::deleteComments | ( | ) |
Supprime tous les couples de commentaires déja définis.
Encoding::Type cogitant::IStream::encoding | ( | ) | const |
Type d'encodage du flux.
bool cogitant::IStream::eof | ( | ) | const |
Fin du flux de lecture atteinte.
|
virtual |
Lecture d'un caractère sans aucune interprétation.
Le caractère est retourné mais n'est pas passé (une autre lecture retourne le même caractère).
|
virtual |
Gère le caractère lu juste après un caractère d'échappement.
Par défaut, cette méthode se contente d'ajouter à result le caractère c lu, tel quel, mais la méthode peut être redéfinie.
Reimplemented in cogitant::OperationRdfsN3Input::IStreamRdfsN3.
|
virtual |
Passage au caractère suivant dans le flux.
|
virtual |
Ignorer plusieurs caractères dans le flux.
|
virtual |
Initialisation du flux.
Cette méthode doit être appelée avant de commencer la lecture dans le flux : elle initialise les compteurs de ligne/colonne.
st | type de flux. La valeur Encoding::DEFAULT utilise une détection automatique de l'encodage du flux. Avec cette valeur, la classe considère que le flux est en Utf-8 jusqu'à ce qu'un caractère incorrect en Utf-8 soit trouvé (init() positionne donc à true m_autoutf8). |
Reimplemented in cogitant::OperationRdfsN3Input::IStreamRdfsN3, and cogitant::XmlInput::IStreamXml.
|
virtual |
Le caractère doit il être ignoré.
En dehors des unités lexicales, certains caractères sont ignorés, si cette méthode n'est pas définie, il s'agit de espace \r \n \t
.
|
virtual |
Le caractère est-il le caractère d'échappement.
Si cette méthode n'est pas redéfinie dans les sous-classes, il n'y a aucun caractère d'échappement et tous les caractère sont lus sans interprétation.
Reimplemented in cogitant::OperationRdfsN3Input::IStreamRdfsN3, cogitant::OperationBCGCTInput::IStreamBCGCT, and cogitant::OperationCGIFInput::IStreamCGIF.
|
virtual |
La chaîne passée est-elle un mot clef du format.
Si cette méthode n'est pas redéfinie dans les sous-classes, aucune chaîne n'est considérée comme un mot clef.
Reimplemented in cogitant::OperationRdfsN3Input::IStreamRdfsN3, cogitant::XmlInput::IStreamXml, and cogitant::OperationBCGCTInput::IStreamBCGCT.
|
virtual |
Le caractère passé est-il le caractère d'ouverture de guillements utilisé par readString().
c | caractère à tester. |
begin | caractère d'ouverture de guillements si vrai, caractère de fermeture si faux. |
"
et uniquement ce caractère-là. Reimplemented in cogitant::XmlInput::IStreamXml.
|
virtual |
Le caractère est-il un séparateur dans le format.
Quand une chaîne de caractères est lue (que ce soit pour un identificateur, un commentaire ou un mot clef) la lecture s'arrête dès qu'un séparateur est rencontré. Si cette méthode n'est pas redéfinie dans les sous classes, les caractères suivants sont considérés comme des séparateurs : les caractères pour lesquels isBlankChar() retourne true
et ceux pour lesquels isSpecialChar() retourne true
.
Reimplemented in cogitant::XmlInput::IStreamXml.
|
virtual |
Le caractère est-il un caractère spécial dans le format.
Un caractère spécial est un caractère qui correspond à un lexème à lui tout seul (de type Lexeme::LEX_SPECIALCHAR). Si cette méthode n'est pas redéfinie dans les sous-classes, aucun caractère n'est considéré comme un caractère spécial.
Reimplemented in cogitant::OperationRdfsN3Input::IStreamRdfsN3, cogitant::XmlInput::IStreamXml, cogitant::OperationBCGCTInput::IStreamBCGCT, and cogitant::OperationCGIFInput::IStreamCGIF.
|
protected |
Longueur du flux.
|
virtual |
Convertit le lexème en chaîne de caractères représentant le lexème.
Évidemment, aucun lexème particulier n'étant défini dans IStream, cette méthode ne peut être utilisée qu'avec des lexèmes LEX_SPECIALCHAR (dans ce cas, la méthode retourne une chaîne formée d'un seul caractère, de code ascii l) ou LEX_STRING. Il est donc nécessaire de redéfinir cette méthode dans les sous classes de IStream pour l'adapter aux lexèmes particuliers.
l | lexeme à traduire. |
Reimplemented in cogitant::OperationRdfsN3Input::IStreamRdfsN3, cogitant::XmlInput::IStreamXml, and cogitant::OperationBCGCTInput::IStreamBCGCT.
Line cogitant::IStream::line | ( | ) | const |
Accès à la ligne courante.
void cogitant::IStream::memoPosition | ( | ) |
Mémorisation d'une position.
|
virtual |
Lecture d'un caractère sans aucune interprétation et passage au caractère suivant.
Idem getChar() mais le caractère lu est passé.
void cogitant::IStream::readBytes | ( | unsigned char * | c, |
unsigned int | lg | ||
) |
Lecture brute d'octets.
c | repère la zone dans lequel les caractères lus seront stockés. |
lg | nombre de caractères à lire. |
|
virtual |
Lecture de l'unité lexicale suivante.
l | (sortie) lexème lu. |
|
virtual |
Lecture d'une chaîne jusqu'au prochain séparateur.
Cette méthode n'interprète pas les mots-clefs mais lit le flux d'entrée et retourne une chaîne dans laquelle les caractères d'échappement ont été interprétés (mais pas d'éventuels guillemets).
s | (R) chaîne lue. |
|
virtual |
La précédente lecture de chaine était elle entre guillemets ou pas.
void cogitant::IStream::setCompressed | ( | unsigned long | decosize | ) |
Passage en mode compressé.
Lors du passage ne mode compressé, le flux est lu totalement en mémoire, et il est décompressé dans un buffer. Les lectures suivantes se font donc en mémoire et sont rapides, mais l'occupation mémoire est importante. Il serait bien de prévoir une deuxième méthode de passage en mode compressé qui ne décompresse pas en mémoire, mais décompresse au fur et à mesure des lectures, toutefois.
decosize | Taille du buffer devant contenir la zone décompressée. Ce buffer doit être de taille suffisante pour contenir le contenu décompressé du flux. |
void cogitant::IStream::setEncoding | ( | Encoding::Type | nt, |
bool | autoutf8 = false |
||
) |
Modifie l'encodage du flux.
nt | Type d'encodage. |
autoutf8 | si true considère le flux comme étant de l'utf-8 jusqu'à ce qu'un caractère invalide en utf-8 soit trouvé, ce qui a alors pour effet de passer en Latin9. |
void cogitant::IStream::setIgnoreComments | ( | bool | ic | ) |
Ignorer les marques de début/fin de commentaires.
Si les marques sont ignorées, elles sont lues comme des lexemes comme les autres.
void cogitant::IStream::setReadBom | ( | bool | rb | ) |
Modifie la lecture du BOM.
Par défaut le BOM est lu au début du fichier, et, normalement, si aucun BOM n'est trouvé, cela est sans conséquences. Il est possible d'appeler cette méthode avant init() afin de ne pas lire le BOM lors de l'initialisation du flux. Pour cela, il faut passer false
comme paramètre.
|
virtual |
Assignation du flux de lecture.
is | pointeur sur le flux de lecture (précédemment ouvert) utilisé par l'instance. |
sn | nom donné au flux (habituellement le nom du fichier) utilisé dans la levée d'exceptions. |
std::istream const* cogitant::IStream::stream | ( | ) | const |
Accès direct au flux.
|
protected |
Simulation de la méthode get() sur le flux.
|
protected |
Lecture du prochain caractère du flux, en utilisant un décodage Utf16.
std::string const& cogitant::IStream::streamName | ( | ) | const |
Nom du flux.
|
protected |
Simulation de la méthode peek() sur le flux.
|
protected |
Accès au prochain caractère du flux, en utilisant un décodage Utf16.
|
protected |
Simulation de la méthode read() sur le flux.
Les octets lus sont stockés dans buf.
void cogitant::IStream::stringAddChar | ( | std::string & | s, |
wchar_t | c | ||
) | const |
Ajoute à une chaîne un caractère en convertissant ce caractère si nécessaire.
Cette méthode est publique afin de permettre, à partir d'une autre classe, une lecture dans un flux caractère par caractère par nextChar(). Or nextChar() n'effectue pas de conversion d'encodage (contrairement à readLexeme() quand il rencontre une chaîne), il est donc nécessaire d'offrir une méthode utilisant la même méthode de conversion que celle utilissée dans readLexeme().
std::string const* cogitant::IStream::stringConvert | ( | std::string const & | s, |
std::string & | result | ||
) |
Convertit la chaîne si le mode de conversion d'encodage est EC_STRING.
s | chaîne à convertir. |
result | (R) chaîne convertie, uniquement dans le cas où la chaîne s a dû être convertie. result n'est pas définie (pour des raisons de performance) si la méthode retourne false . |
std::streampos cogitant::IStream::tellg | ( | ) | const |
Position actuelle dans le flux.
void cogitant::IStream::throwException | ( | Lexeme const & | found, |
Lexeme const & | expected1, | ||
Lexeme const & | expected2 = Lexeme() , |
||
Lexeme const & | expected3 = Lexeme() , |
||
Lexeme const & | expected4 = Lexeme() , |
||
Lexeme const & | expected5 = Lexeme() |
||
) |
Lever une exception d'analyse syntaxique.
Lève une exception d'analyse syntaxique de type ExceptionInputLexeme sur la ligne en cours avec le message "xxx (ou xxx ou xxx) attendu, mais xxx trouvé.". Le code de l'exception est l'identificateur du (premier) lexème attendu.
LexemeType cogitant::IStream::verifyLexeme | ( | Lexeme const & | s, |
LexemeType | ltypes[], | ||
wchar_t | lchars[] | ||
) |
Vérifie si le lexème est d'un des types donnés.
s | lexème. |
ltypes | tableau de types de lexèmes autorisés (terminé par LEX_UNKNOWN). |
lchars | tableau de caractères spéciaux autorisés, associés aux LEX_SPECIALCHAR de types. |
|
static |
La marque de fin de fichier.
|
static |
Un caractère spécial dans le format interprété : son code est dans m_char.
Les caractères reconnus comme lexèmes sont différents selon les formats, il peut s'agir par exemple de "<code>:</code>", "<code>;</code>", ou "<code>{</code>".
|
static |
Un identificateur : une chaîne dans m_string.
|
static |
Lexème non défini ou en erreur.
|
protected |
Passage automatique d'un encodage Utf-8 à un encodage Latin9.
Si cet attribut est défini à true
, le flux est lu en Utf-8 (et donc m_encoding doit être égal à Encoding::UTF8) jusqu'à ce qu'un caractère non valide soit lu en Utf-8. Le flux passe alors en Latin9.
|
protected |
Position en cours de lecture dans la ligne.
Les tabulations ne comptent que pour un caractère.
|
protected |
Chaines de début de comentaires.
Ce qui figure dans un commentaire n'est pas interprété et passé par readLexeme().
|
protected |
Chaines de fin de commentaire.
La ième fin de commentaire ne termine que le ième début de commentaire. Si un commentaire peut se terminer de différentes façons, il doit figurer plusieurs fois dans ces deux tables, avec, à chaque fois une fin différente.
|
protected |
Compression.
|
protected |
Buffer utilisé pour la décompression.
|
protected |
Position de lecture dans le buffer de décompression.
|
protected |
Taille du buffer de décompression.
|
protected |
Conversion d'encodage.
|
protected |
Type d'encodage du flux.
|
protected |
Ignorer les marques de commentaires.
|
protected |
Caractères lus mais qui doivent être interprétés à nouveau.
|
protected |
Si défini à vrai (par défaut) tente de lire le BOM en début de flux pour déterminer l'encodage.