Cela fait partie d'une série de questions qui se concentre sur le projet frère du projet Abstraction, qui vise à résumer les concepts utilisés dans la conception du langage sous la forme d'un cadre. Le projet sœur s'appelle OILexer, qui vise à construire un analyseur à partir de fichiers de grammaire, sans utiliser d'injection de code sur les correspondances.
Quelques autres pages associées à ces questions, liées au typage structurel, peuvent être consultées ici , et la facilité d'utilisation, ici . Le méta-sujet associé à une enquête sur le cadre et le bon endroit pour publier peut être trouvé ici .
J'arrive au point où je suis sur le point de commencer à extraire l'arbre d'analyse d'une grammaire donnée, suivi d'un analyseur de descente récursive qui utilise DFA pour discerner les chemins avant (similaire à LL (*) d'ANTLR 4, donc je pensé que je l'ouvrirais pour avoir un aperçu.
Dans un compilateur d'analyseur, quels types de fonctionnalités sont idéales?
Jusqu'à présent, voici un bref aperçu de ce qui est mis en œuvre:
- Modèles
- Anticipez la prévision, sachant ce qui est valable à un moment donné.
- Règle de «délitéralisation» prenant les littéraux dans les règles et déterminant de quel jeton ils proviennent.
- Automates non déterministes
- Automates déterministes
- Machine d'état lexicale simple pour la reconnaissance des jetons
- Méthodes d'automatisation des jetons:
- Scan - utile pour les commentaires: Commentaire: = "/ *" Scan ("* /");
- Soustraire - Utile pour les identifiants: Identifier: = Soustraire (IdentifierBody, Keywords);
- Garantit que l'identifiant n'accepte pas les mots clés.
- Encode - Encode une automatisation sous la forme d'un décompte série X des transitions N de base.
- UnicodeEscape: = "\\ u" BaseEncode (IdentifierCharNoEscape, 16, 4);
- Fait un échappement unicode en hexadécimal, avec 4 transitions hexadécimales. La différence entre ceci et: [0-9A-Fa-f] {4} est que l'automatisation résultante avec Encode limite l'ensemble autorisé de valeurs hexadécimales à la portée d'IdentifierCharNoEscape. Donc, si vous lui donnez \ u005c, la version d'encodage n'acceptera pas la valeur. Des choses comme celle-ci ont une sérieuse mise en garde: utilisez avec parcimonie. L'automatisation qui en résulte pourrait être assez complexe.
- UnicodeEscape: = "\\ u" BaseEncode (IdentifierCharNoEscape, 16, 4);
Ce qui n'est pas implémenté est la génération CST, j'ai besoin d'ajuster les automatisations déterministes pour conserver le contexte approprié pour que cela fonctionne.
Pour toute personne intéressée, j'ai téléchargé une jolie copie de la forme originale du projet T * y♯ . Chaque fichier devrait être lié à un autre, j'ai commencé à lier les règles individuelles pour les suivre, mais cela aurait pris beaucoup trop de temps (cela aurait été plus simple à automatiser!)
Si plus de contexte est nécessaire, veuillez poster en conséquence.
Edit 5-14-2013 : J'ai écrit du code pour créer des graphiques GraphViz pour les machines à états dans une langue donnée. Voici un digraphe GraphViz du AssemblyPart . Les membres liés dans la description de la langue doivent avoir un rulename.txt dans leur dossier relatif avec le digraphe de cette règle. Une partie de la description de la langue a changé depuis que j'ai posté l'exemple, cela est dû à la simplification des choses sur la grammaire. Voici une image graphique intéressante .