2016-09-01 1 views
0

Maintenant, je développe une machine virtuelle. L'interpréteur Bytecode utilise flex et bison. Voici un code par exemple:Comment implémenter la dérivation dans un interpréteur à base de bisons?

some: 
add r0 4 4 
jmp some 

Ma question est: comment gérer l'instruction jmp? Puis-je demander aux bisons de retourner à une étiquette, en poursuivant l'analyse?

Je développe l'interprète de bytecode, pas compilateur ...

+0

Duplicata de http://stackoverflow.com/questions/37186142/goto-label-in-the-same-loop-in-bison/ –

Répondre

0

Non, vous ne pouvez pas revenir en arrière bison. Habituellement Bison analyse le code et génère une sorte de représentation intermédiaire. Comme un AST ou un bytecode. Ensuite, vous exécutez cela dans une étape séparée. Par conséquent, dans votre cas, puisque vous analysez un langage d'assemblage pour un format de bytecode, il est logique de le traduire en bytecode réel. C'est quand votre analyseur voit "ajouter r0 4 4", tout ce qu'il devrait faire est d'ajouter la séquence d'octets correspondante à un tableau contenant votre bytecode. Ensuite, après que l'analyseur a créé ce tableau, vous pouvez le passer à une fonction qui exécute réellement le bytecode.

Il serait probablement judicieux de scinder ces deux étapes en deux programmes distincts: un assembleur qui transforme un fichier source en un fichier de bytecode binaire, et un interprète bytecode qui lit un fichier bytecode et l'exécute. Ce dernier n'aurait pas besoin d'utiliser Bison du tout, il suffit de lire les octets et switch sur eux.

+0

Oh, j'ai compris! Nous traduisons d'abord une version texte du bytecode dans un véritable bytecode binaire (assembleur), puis l'exécutons par un programme/algorithme séparé. L'anglais n'est pas ma langue maternelle ... Y a-t-il d'autres noms de "bytecode intermédiaire", "bytecode réel"? – Saitei

+0

@Saitei La version textuelle est habituellement appelée "assembly code/language" ou "assembly" (tout comme les versions textuelles des vrais langages machine) et la version binaire comme "bytecode". – sepp2k

+0

Merci! Tu m'as beaucoup aidé! – Saitei