Compilation W en P-CODE

Source W p-code Remarque
begin [nom]
background [nom]
PROG / BACK
BEXC
VERS <num3>
INCL <nom_fic_source>
SRCL <num_ligne>
PNAM [nom]
première instruction en assembleur
l'offset de BEXC sera calculé par l'assembleur



[nom] du programme est optionnel
library([a[,b]]) LIBR
BEXC
VERS <num3>
INCL <nom_fic_source>
PARM <a>
PARM <b>
SRCL <num_ligne>
première instruction en assembleur
l'offset de BEXC sera calculé par l'assembleur


les paramètres [a[,b]] sont optionnels et variables
except SRCL <num_ligne>
EXCE
end SRCL <num_ligne>
ENDP / ENDL
ENDP si PROG ou BACK, ENDL si LIBR
sub <nom>([param1[,param2]]) SRCL <num_ligne>
SUBR <nom>
BEXC
[PARM param1]
[PARM param2]

adresse ends calculee par l'assembleur
adresse except calculée par l'assembleur
endsub SRCL <num_ligne>
ENDS
throw <num8> SRCL <num_ligne>
THRW <num8>
catch SRCL <num_ligne>
CATC
include "fichier“
include 'fichier'
SRCL <num_ligne>
INCL <fichier>
… p-code du fichier …
INCL
en assembleur, <fichier> sans les doubles-quotes/quotes


a la fin du traitement du fichier include
part <num3> SRCL <num_ligne>
PART <num3>
nop SRCL <num_ligne>
declare x[,y] SRCL <num_ligne>
DECL x
DECL y
nombre de déclarations variable
loop

… p-code …
break

… p-code …
continue

… p-code …
endloop
:L
SRCL <num_ligne>

SRCL <num_ligne>
JUMP :l

SRCL <num_ligne>
JUMP :L

SRCL <num_ligne>
JUMP :L
:l
:L et :l sont des marqueurs pour que l'assembleur calcule les adresse des sauts
input ident1[.ident2][!ident3] SRCL <num_ligne>
PVAR ident1
PVAH ident2
PVAI ident3
INPT

Code assembleur pour une Variable
return SRCL <num_ligne>
RETN
returnon <expr> SRCL <num_ligne>
<expr>
RETT
<expr> enchaîne les opérations sur la pile.
RETT dépile et si # 0 : return
break SRCL <num_ligne>
<expr>
JUMP :l :f
:l si loop, :f si for
breakon <expr> SRCL <num_ligne>
<expr>
JMPT :l :f
:l si loop, :f si for.
<expr> enchaîne les opérations sur la pile.
JMPT dépile et si # 0 : saut
continue SRCL <num_ligne>
<expr>
JUMP :L :F
:L si loop, :F si for
continueon <expr> SRCL <num_ligne>
<expr>
JMPT :L :F
:L si loop, :F si for.
<expr> enchaîne les opérations sur la pile.
JMPT dépile et si # 0 : saut
do routine([x[,y[,z]]]) SRCL <num_ligne>
CRAZ
<var z>
PSHA
<var y>
PSHA
<var x>
PSHA
<var routine>
CALL _
Appel simple d'une subroutine.
Les paramètres sont empilés à l'envers.
Chaque paramètre est un enchaînement de PVAR/PVAH/PVAI.
invoke <module>&<fonction>([x[,y[,z]]]) SRCL <num_ligne>
CRAZ
<var y>
PSHA
<var x>
PSHA
MODL <module>@<fonction>
<module> maxi 21 cars. <fonction> maxi 23 cars.
Maxi. 3 paramètres, chacun est un enchaînement de PVAR/PVAH/PVAI.
TODO invoke
call <fonction>([x[,y]]) SRCL <num_ligne>
CRAZ
<var y>
PSHA
<var x>
PSHA
CLIB <fonction>
Chaque paramètre est un enchaînement de PVAR/PVAH/PVAI.
<fonction> maxi 255 cars.
TODO call
let <var> = <expr> SRCL <num_ligne>
<expr>
<var>
POPV
<expr> enchaîne les opérations sur la pile
ou variable à affecter (PVAR/PVAH/PVAI)
ou new <classe>
<var> est un enchaînement de PVAR/PVAH/PVAI.
echo / echonl <var> SRCL <num_ligne>
<var>
WRIT / WRLN
<var> est un enchaînement de PVAR/PVAH/PVAI.
echo / echonl “chaine” 'chaine' SRCL <num_ligne>
PVAT
DSET “chaine”
WRIT / WRLN
TODO avec <expr>
delet <var> SRCL <num_ligne>
<var>
DELE
<var> est un enchaînement de PVAR/PVAH/PVAI.
if <expr> then / else
… p-code …



elseif <expr> then / else
… p-code …




else
… p-code …


endif
:I
SRCL <num_ligne>
<expr>
JMPF :E / JMPT :E

JUMP :e
E:
SRCL <num_ligne>
<expr>
JMPF :E / JMPT :E

JUMP :e
E:
SRCL <num_ligne>

:e
SRCL <num_ligne>
Les elseif et else ne sont pas obligatoires.
Dès qu'une clause else apparaît, d'autres elseif ou else ne sont pas autorisés.

Les JMPF :E et JMPT :E sautent au premier :E à suivre du même niveau.
foreach <var1> in <var2> like <var3>


… p-code …
break

… p-code …
continue

… p-code …
endfor
SRCL <num_ligne>
TODO
:F

SRCL <num_ligne>
JUMP :f

SRCL <num_ligne>
JUMP :F

SRCL <num_ligne>
JUMP :F
:f
:F et :f sont des marqueurs pour que l'assembleur calcule les adresse des sauts
class <name> = {<base>}
precision <expr>
setsep <expr>,<expr>
free <var>
<expr>
+
-
*
/
div
mod
abs
neg
int
frac
round
=
#
<
>
< =
> =
and
or

ADDN
SBCN
MULN
DIVN
DIVE
MODN
ABSN
NEGN
INTE
FRAC
ROUN
COMP 1
COMP 2
COMP 3
COMP 4
COMP 5
COMP 6
COMP 7
COMP 8
valeurs empilées

Outils pour utilisateurs