\"
, \n
, \\
,
Instruction | Description |
ADD | dépile n puis m qui doivent être entiers et empile le résultat m+n |
SUB | dépile n puis m qui doivent être entiers et empile le résultat m−n |
MUL | dépile n puis m qui doivent être entiers et empile le résultat m× n |
DIV | dépile n puis m qui doivent être entiers et empile le résultat m/n |
MOD | dépile n puis m qui doivent être entiers et empile le résultat m mod n |
NOT | dépile n qui doit être un entier et empile le résultat de n=0 |
INF | dépile n puis m qui doivent être entiers et empile le résultat m < n |
INFEQ | dépile n puis m qui doivent être entiers et empile le résultat m ≤ n |
SUP | dépile n puis m qui doivent être entiers et empile le résultat m > n |
SUPEQ | dépile n puis m qui doivent être entiers et empile le résultat m ≥ n |
Instruction | Description |
FADD | dépile n puis m qui doivent être réels et empile le résultat m+n |
FSUB | dépile n puis m qui doivent être réels et empile le résultat m−n |
FMUL | dépile n puis m qui doivent être réels et empile le résultat m× n |
FDIV | dépile n puis m qui doivent être réels et empile le résultat m/n |
FCOS | dépile n qui doit être réel et empilet cos(n) |
FSIN | dépile n qui doit être réel et empilet sin(n) |
FINF | dépile n puis m qui doivent être réels et empile le résultat m < n |
FINFEQ | dépile n puis m qui doivent être réels et empile le résultat m ≤ n |
FSUP | dépile n puis m qui doivent être réels et empile le résultat m > n |
FSUPEQ | dépile n puis m qui doivent être réels et empile le résultat m ≥ n |
Instruction | Description |
PADD | dépile n qui doit être un entier puis a qui doit être une adresse et empile l'adresse a+n |
ISADDR | dépile une valeur v et empile 1 si v est une adresse (sur le tas ou la pile) et 0 sinon |
Instruction | Description |
CONCAT | dépile n puis m qui doivent être des adresses de chaîne, empile l'adresse d'une chaîne égale à la concaténation de la chaîne d'adresse n et de celle d'adresse m. |
Instruction | Argument | Description |
ALLOC | n entier | alloue sur le tas un bloc structuré de taille n et empile l'adresse correspondante |
ALLOCN | dépile un entier n, alloue sur le tas un bloc structuré de taille n et empile l'adresse correspondante | |
FREE | dépile une adresse a et libère le bloc structuré alloué à l'adresse a |
Instruction | Description |
EQUAL | dépile n puis m et empile le résultat de n=m lorsque n et m sont de même type, et 0 sinon |
Instruction | Description |
ATOI | dépile l'adresse d'une chaîne et empile sa conversion en nombre entier, échoue si la chaîne ne représente pas un entier. |
ATOF | dépile l'adresse d'une chaîne et empile sa conversion en nombre réel, échoue si la chaîne ne représente pas un réel. |
ITOF | dépile un entier et empile sa conversion en nombre réel. |
FTOI | dépile un réel et empile l'entier représentant sa partie entière (obtenue en supprimant les décimales). |
STRI | dépile un entier et empile l'adresse d'une chaîne représentant cet entier |
STRF | dépile un réel et empile l'adresse d'une chaîne représentant ce réel |
Instruction | Argument | Description |
PUSHI | n entier | empile n |
PUSHN | n entier | empile n fois la valeur entière 0 |
PUSHF | n réel | empile n |
PUSHS | n chaîne | stocke n dans la zone des chaînes et empile l'adresse |
PUSHG | n entier | empile la valeur située en gp[n] |
PUSHL | n entier | empile la valeur située en fp[n] |
PUSHSP | empile la valeur du registre sp | |
PUSHFP | empile la valeur du registre fp | |
PUSHGP | empile la valeur du registre gp | |
LOAD | n entier | dépile une adresse a et empile la valeur dans la pile ou le tas située en a[n] |
LOADN | dépile un entier n, une adresse a et empile la valeur dans la pile ou le tas située en a[n] | |
DUP | n entier | duplique et empile les n valeurs en sommet de pile |
DUPN | dépile un entier n, puis duplique et empile les n valeurs en sommet de pile |
Instruction | Argument | Description |
POP | n entier | dépile n valeurs dans la pile |
POPN | dépile un entier n puis dépile n valeurs dans la pile |
Instruction | Argument | Description |
STOREL | n entier | dépile une valeur et la stocke dans la pile en fp[n] |
STOREG | n entier | dépile une valeur et la stocke dans la pile en gp[n] |
STORE | n entier | dépile une valeur v et une adresse a, stocke v à l'adresse a[n] dans la pile ou le tas |
STOREN | dépile une valeur v, un entier n et une adresse a, stocke v à l'adresse a[n] dans la pile ou le tas |
Instruction | Argument(s) | Description |
CHECK | n,p entiers | vérifie que le sommet de la pile est un entier i tel que n ≤ i ≤ p, sinon déclenche une erreur |
SWAP | dépile n puis m et rempile n puis m |
Instruction | Description |
WRITEI | dépile un entier et l'imprime sur la sortie standard |
WRITEF | dépile un réel et l'imprime sur la sortie standard |
WRITES | dépile l'adresse d'une chaîne et imprime la chaîne correspondante sur la sortie standard |
READ | lit une chaîne de caractères au clavier, terminée par un retour-chariot, stocke la chaîne (sans le retour-chariot) et empile l'adresse. |
Instruction | Description |
DRAWPOINT | dépile m puis n qui doivent être entiers et dessine un point de coordonnées (n,m) |
DRAWLINE | dépile q,p,m puis n qui doivent être entiers et dessine un segment entre les points de coordonnées (n,m) et (p,q) |
DRAWCIRCLE | dépile p,m puis n qui doivent être entiers et dessine un cercle de centre (n,m) et de rayon p |
DRAWRECT | dépile h,w,m puis n qui doivent être entiers et dessine un rectangle de coin supérieur gauche (n,m), de largeur w et de hauteur h |
FILLRECT | comme DRAWRECT mais dessine un rectangle plein |
OPENDRAWINGAREA | Dépile h puis w qui doivent être entiers et ouvre une nouvelle fenêtre graphique de largeur w et de hauteur h |
CLEARDRAWINGAREA | Efface la sortie graphique et réinitialise la couleur courante à “Noir” |
SETCOLOR | dépile b,g puis r qui doivent être entiers et change la couleur courante suivant la valeur RGB définie par les trois entiers compris entre 0 et 65535 |
REFRESH | raffraichît la fenêtre graphique, i.e. rend visibles les opérations graphiques effectuées depuis le dernier raffraichissement |
Instruction | Description |
GET | empile la valeur contenue dans la pièce où l'on se trouve |
SET | dépile une valeur entière et l'affecte à la pièce où l'on se trouve |
MOVE | tente un déplacement vers la pièce se trouvant en face de soi ; empile 1 (vrai) si le déplacement était possible, 0 (faux) sinon |
TURNLEFT | effectue un quart de tour vers la gauche |
TURNRIGHT | effectue un quart de tour vers la droite |
Instruction | Argument | Description |
JUMP | label étiquette | affecte au registre pc l'adresse dans le programme correspondant à label qui peut être un entier ou une valeur symbolique. |
JZ | label étiquette | dépile une valeur, si elle est nulle affecte au registre pc l'adresse dans le programme correspondant à label sinon incrémente pc de 1. |
PUSHA | label étiquette | empile l'adresse dans le code correspondant à l'étiquette label |
Instruction | Description |
CALL | dépile une adresse de code a, sauvegarde pc et fp dans la pile des appels, affecte à fp la valeur courante de sp et à pc la valeur a. |
RETURN | affecte à sp la valeur courante de fp, restaure de la pile des appels les valeurs de fp et pc et incrémente pc de 1 pour se retrouver à l'instruction suivant celle d'appel. |
Instruction | Argument | Description |
START | Affecte la valeur de sp à fp | |
NOP | ne fait rien. | |
ERR | x chaîne | déclenche une erreur d'instruction avec le message x. |
STOP | arrête l'exécution du programme |
//
et se poursuivent jusqu'à la
fin de la ligne.
Les identificateurs obéissent à l'expression régulière 〈ident〉
suivante :
〈digit〉 | ::= | 0–9 |
〈alpha〉 | ::= | a–z | A–Z |
〈ident〉 | ::= | (〈alpha〉 | _) (〈alpha〉 | 〈digit〉 | _ | ')⋆ |
〈integer〉 | ::= | -? 〈digit〉+ |
〈float〉 | ::= | -? 〈digit〉+ (. 〈digit〉⋆)? ((e | E) (+ | -)? 〈digit〉+)? |
"
,
et peuvent contenir ce même caractère seulement s'il est précédé du
caractère \
. En d'autres termes, les chaînes obéissent à
l'expression régulière suivante :
〈string〉 | ::= | " ([^ " ] | \ " )⋆ " |
〈code〉 ::= 〈instr〉* 〈instr〉 ::= 〈ident〉 : | 〈instr_atom〉 | 〈instr_int〉 〈integer〉 | pushf 〈float〉 | (pushs | err) 〈string〉 | check 〈integer〉 , 〈integer〉 | (jump | jz | pusha) 〈ident〉 〈instr_atom〉 ::= add | sub | mul | div | mod | not | inf | infeq | sup | supeq | fadd | fsub | fmul | fdiv | fcos | fsin | finf | finfeq | fsup | fsupeq | concat | equal | atoi | atof | itof | ftoi | stri | strf | padd | isaddr | pushsp | pushfp | pushgp | loadn | storen | swap | writei | writef | writes | read | call | return | drawpoint | drawline | drawcircle | drawrect | fillrect | cleardrawingarea | opendrawingarea | setcolor | refresh | start | nop | stop | allocn | free | dupn | popn | get | set | move | turnleft | turnright 〈instr_int〉 ::= pushi | pushn | pushg | pushl | load | dup | pop | storel | storeg | alloc
Figure 1: Syntaxe des programmes
vm [options] [fichier.vm]Lorsque le fichier est omis, le code est lu sur l'entrée standard. Les options sont les suivantes :
gvm [options] [fichier.vm]Les seules options sont -ssize et -csize, similaires à celles de la machine vm.
"
message"
Ce document a été traduit de LATEX par HEVEA