Il existe de nombreux langages de programmation qui ont leurs propres caractéristiques uniques. Mais pour qu'un programme écrit dans l'un d'eux fonctionne, vous devez le diffuser. Parfois, les langages de programmation sont développés pour leurs propres besoins (par exemple, prise en charge de l'automatisation dans les grandes applications) et il devient alors nécessaire d'écrire un traducteur.
Nécessaire
- - grammaire naturelle ou BNF de la langue source;
- - outils de développement.
Instructions
Étape 1
Préparer les données pour l'analyse lexicale du texte dans la langue source. Répertoriez tous les jetons de la langue. Décomposez-les en catégories (mots-clés, littéraux numériques et de chaîne, identifiants, espaces, ponctuation, etc.).
Étape 2
Implémenter un module ou un lexer. A l'entrée, il doit recevoir un flux de données "brutes", et à la sortie former une liste d'éléments contenant des jetons et leurs identifiants de type dans l'ordre dans lequel ils apparaissent dans le texte source. Le programme d'analyse peut être un " assez simple " scanner à un seul niveau". La mise en œuvre de la récupération d'erreur n'a pas de sens. Les caractères invalides doivent être traités comme des erreurs.
Étape 3
Préparez les données pour l'analyse. Sur la base de la grammaire naturelle ou BNF de la langue source, composez sa grammaire LL1. Sur la base de ce type de grammaire, établissez un schéma d'analyse en termes de catégories de jetons valides et de constructions sémantiques du langage.
Étape 4
Implémenter un module ou un analyseur. En entrée, il doit recevoir une liste de jetons préparée au stade de l'analyse lexicale. Développez des algorithmes de vérification de syntaxe récursive à l'aide du schéma que vous avez créé à l'étape trois. Si nécessaire, implémentez des mécanismes de récupération d'erreur. Ajoutez des fonctionnalités aux algorithmes d'analyse pour construire une arborescence de calcul de fonctions, de méthodes de classe. Avec la structure correcte des algorithmes d'analyse, cette fonctionnalité peut être implémentée sans aucun problème. Cela évite d'avoir à l'implémenter en tant que module séparé. Les structures de données créées doivent contenir des listes d'instructions sous forme de séquences "plates" (expressions arithmétiques développées sous forme de suffixe adapté au calcul sur une machine à pile, boucles converties en combinaisons de séquences d'instructions de calcul et de sauts conditionnels ou inconditionnels, etc.).
Étape 5
Créez un module d'optimisation si nécessaire. Il doit traiter et transformer les structures de données préparées à l'étape précédente. Les algorithmes et méthodes d'optimisation sont très divers.
Étape 6
Développer un générateur de code. Lors du traitement des structures préparées dans les quatrième ou cinquième étapes, il convient simplement de transformer les séquences d'instructions abstraites en instructions à exécuter sur une plate-forme spécifique.
Étape 7
Créez un programme de reliure (linker) si nécessaire. Il doit former le module exécutable résultant en choisissant l'emplacement des segments de code, en calculant les adresses des étiquettes, etc.