J’ai écrit un Lexer en C, lexe actuellement les fichiers en ASCII, mais je ne comprends pas comment lex unicode. De quel format unicode aurais-je besoin pour Lex, par exemple, devrais-je prendre en charge utf-8, utf-16, etc. Qu’est-ce que les langages comme Rust ou Go supportent?
Si tel est le cas, y a-t-il des bibliothèques qui peuvent m’aider, même si je préférerais essayer de le faire moi-même pour pouvoir apprendre. Même dans ce cas, une petite bibliothèque que je pourrais lire pour apprendre serait formidable.
Il existe déjà une version de lex (et d’autres outils lexer prenant en charge UniCode) et ils sont répertoriés dans la page WikiPedia: Liste des générateurs Lexer . Il existe également une liste d’outils de lexer sur la page d’parsing de Wikipedia . En résumé, les outils suivants gèrent UniCode:
- JavaCC – JavaCC génère des parsingurs lexicaux écrits en Java.
- JFLex – Un générateur d’parsingurs lexicaux pour Java.
- Quex – Un générateur d’parsingur lexical universel rapide pour C et C ++.
- FsLex – Un générateur de lexer pour la saisie de caractères octets et Unicode pour F #
Et, bien sûr, il existe les techniques utilisées par W3.org et citées par @jim mcnamara à l’ adresse http://www.w3.org/2005/03/23-lex-U .
Vous dites que vous avez écrit votre propre lexer en C , mais vous avez utilisé la balise lex
pour l’outil appelé lex
; c’était peut-être un oubli?
Dans les commentaires, vous dites que vous n’avez pas utilisé d’expressions régulières, mais que vous souhaitez également apprendre. Apprendre quelque chose sur la théorie de la reconnaissance des langues est essentiel pour écrire un lexer efficace et fonctionnel. Les symboles reconnus sont classés en tant que langage de type 3 de Chomsky ou langage régulier , qui peut être décrit par des expressions régulières . Les expressions régulières peuvent être implémentées par un code implémentant un automate à états finis (ou machine à états finis ). L’implémentation standard d’une machine à états finis est codée par une boucle contenant un commutateur . La plupart des programmeurs expérimentés doivent savoir et être capables de reconnaître et d’exploiter cette forme:
while ( not <> ) { switch ( input_symbol ) { case ( state_symbol[0] ) : ... case ( state_symbol[1] ) : ... default: .... } }
Si vous aviez codé dans ce style, le même codage pourrait simplement fonctionner, que les symboles traités soient de 8 bits ou de 16 bits, car le modèle de codage algorithmique rest le même.
Le codage ad-hoc d’un parsingur lexical sans compréhension de la théorie et de la pratique sous-jacentes aura finalement ses limites. Je pense que vous trouverez bénéfique de lire un peu plus dans ce domaine.