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).
Etes-vous autorisé à utiliser yacc et lex pour cela? –
@Paul R Je ne pense pas. – Emperor280
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"? –