\", \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