2015-10-09 1 views
-2

Comment écrire un interpréteur simple pour un langage simple en C++ qui obtient un fichier .txt en entrée et l'exécute.Comment écrire un interpréteur simple en C++?

** Juste pour +-/*out fonctions **

entrée (code source): Sortie

int a,b,c; 
a=2; 
b=4; 
c=a+b; 
out c; 

Interprète:

6 

Comment puis-je faire cela? Toute aide ou code source apprécié. Désolé si vous n'avez pas eu ma question, Mon anglais est si mauvais. Juste ignorer le "Interprète" pour une seconde. Je veux écrire un programme de console en C++ qui obtient un fichier txt en tant que code source et reconnaître la commande mathématique de base et "out". est-ce possible en C++ ou non?

+0

Etes-vous autorisé à utiliser yacc et lex pour cela? –

+0

@Paul R Je ne pense pas. – Emperor280

+0

Il n'y a pas trop de réponses possibles: il y a des maths spécifiques pour résoudre ces questions et la façon de les implémenter n'est pas plus large que pour n'importe quelle autre question. Comment supprimer ce "Hold"? –

Répondre

1

Un interprète est généralement fait en 3 étapes:

lexicales Reconnaissez sytèmes simples spécifiques, comme mot-clé, chiffres, symboles, etc. La méthode standard consiste à définir une expression régulière pour chaque lexer. Il y a un algorithme bien défini à l'extérieur pour transformer une reg-exp dans une machine d'état afin que vous puissiez reconnaître n'importe quel travail dans votre entrée.

Ceci est rendu par:

  • Créer une machine d'état de chaque regexp
  • Joignez-vous à toutes les machines d'état
  • Faire la machine d'état déterministe
  • Faire la machine d'état minimal.

Syntaxe Dans cette partie, vous obtenez la séquence de lexer en entrée et créer un arbre avec eux. Selon la complexité de votre langue, il existe différents types: top-> down ou down-> top. (Parlant de LR, LL, LALR, etc.)

file 
|... 
|- c=a+b 
| |- a+b 
     |- a 
     |- + 
     |- b 
    |- = 
    |-c 

sémantique Go votre arbre et cuvette faire les opérations, ainsi, par exemple dans le a + b, vous obtenez l'un, et vous le b résumez-les, puis revenez au nœud ci-dessus et définissez la valeur sur c.

Note finale: Prenez soin de concevoir un mécanisme d'erreur/d'avertissement puissant du départ: type d'erreur, description complète, ligne et caractère où l'erreur est détectée, le niveau de l'erreur/avertissement, etc.

En outre, il pourrait être intéressant de fournir à chaque nœud l'entrée analysée (chaîne), le contenu interprété (LEX_NUMBER) et la valeur interprétée (4).

+0

Cela a été utile, merci. – Emperor280