// ***************************** lmn metalanguage back end ******************************** // ******* (c) Copyright Peri Hankey 2005. Distribution licensed under GNU GPLv2 *****************
.lmn2x(B) // lmn backend wrap rontend with own variables as required - var Is = 0; var If = 0; units <- outer ;
.lmn2x(1010R) // internal to this backend eof <- generate eof; - lmn <- generate ; - uri <- lmn - ; say output <- lmn - ; - out <- output - ;
// internally generated within this backend w <- lmn - 'w' sp ; g <- lmn - 'g' sp ; gx <- lmn - 'G' sp ; vx <- lmn - 'V' sp ; sx :X <- lmn - '(' sp X ')' sp gx;
// backend interface zzz lineNo :A <- lmn - say "ERROR (feature not implemented) near line " A "\n" output ; eoc <- lmn - ; eox <- lmn - '.' sp ; lu :X <- lmn - X ;
top :X <- lmn - lm :X 'T' nl; rdef :A :G :P :N :I :L :J :R <- lmn - m :G P n:N lm :{ I L } lm :{ J R } 'r' nl ; rval rdef :A :G :P :N :I :L :J :R <- lmn - G P nm:N sx :{ I L } sx :{ J R } op:'rule' ;
fd :F :A <- lmn - ; sd :I :B <- lmn - ; ad :I :B <- lmn - ;
ij :I :X <- lmn - sx:X op:'inj' ; lm :X <- lmn - '(' sp X ')' sp ;
bx :X <- lmn - X ;
void <- lmn - 'z' sp ; c :X <- lmn - 'c:' X sp ; d :X <- lmn - 'm:' X sp ; m :X <- lmn - 'm:' X sp ; n :X <- lmn - 'n:' X sp ; v :X <- lmn - 'v:' X sp ; x :X <- lmn - 'l:['X']' sp ;
lp :X <- lmn - 'L:' X sp ; rp :X <- lmn - 'R:' X sp ; bp :X <- lmn - 'B:' X sp ; mp :X <- lmn - 'M:' X sp ;
ac :I :X <- lmn - X ; sv :I :X <- lmn - '(' sp X ')' sp gx; sq :I :X <- lmn - '(' sp X ')' sp gx; dq :X <- lmn - 'd:' X sp gx; ty :X <- lmn - 'v:' X sp gx; vr :X <- lmn - 'v:' X sp gx; va :X <- lmn - 'v:' X sp vx; sy :X <- lmn - 'v:' X sp gx; nm :X <- lmn - 'n:' X sp gx;
ax :X <- lmn - X 'B' sp ; al :X <- lmn - X 'A' sp ; ex :X <- lmn - X 'E' sp ; ea :X <- lmn - X 'e' sp ; t <- lmn - 't' sp ; pp :X <- lmn - X 'p' sp ; pq :I :B <- lmn - lm :B 'p' sp ; pb :X <- lmn - X 'b' sp ; ap :X <- lmn - X op:'apply' ; op :X <- lmn - 'f:' X sp ; ou :X <- lmn - X op:"append" sp ;
r1 :I :B <- lmn - m:"option" B ; rz :I :B <- lmn - m:"repeat" B ; rn :X :I :B <- lmn - X m:"repeatN" B ;
idx :A :B <- lmn - A B op:'idx' ; dot :A :B <- lmn - A d :B gx op:'idt' ;
truth :V <- lmn - op :V ;
arrayinit :A <- lmn - args :A op:'array' ; cellN :X <- lmn - X ; cellV :N :X <- lmn - N X op:'cell' ;
inits :A <- lmn - A eox ; initz :A <- lmn - sy :A sy:"null" w ; initv :A :B <- lmn - sy :A B w ;
xif :E :A :B <- lmn - E sx:A B op:'if' ; xelsif :E :B :C <- lmn - sx :{ iff :B :C :A }; xelse :B <- lmn - sx :B ; xelsez <- lmn - sx :{} ;
xnext :E <- lmn - E ; xtest :E <- lmn - E op :test ; xdo :E :B <- lmn - sx :{ B E } op:'loop'; xwhile :E :B <- lmn - sx :{ E B } op:'loop'; xfor :I :E :N :B <- lmn - I sx :{ E B N } op:'loop';
xcont0 <- lmn - op :"continue"; xbreak0 <- lmn - op :"break" ;
arg :A <- lmn - A ; fn :F :A <- lmn - F op:'args' A op:'fun' ; args :A <- lmn - op:'args' A ;
br :A <- lmn - A ; "," :A :B <- lmn - A eox B ; "?" :A :B :C <- lmn - A sx :{ B } sx:{ C } op:'sel' ; fl :F :A :B <- lmn - A sx :{ B } op:F ; fA :F :A :B <- lmn - A B op :F ; fa :F :A :B <- lmn - A B op :F ; fb :F :A :B <- lmn - A B op :F ; fc :F :A :B <- lmn - A B op :F ; fe :F :A :B <- lmn - A B op :F ; fq :F :A :B <- lmn - A B op :F ; fx :F :A :B <- lmn - A B op :F ; fs :F :A :B <- lmn - A B op :F ;
ur :unary :F :A <- lmn - A op :F ; ux :unary :F :A <- lmn - A op :F ; ub :unary :F :A <- lmn - A op :F ; aa :unary :F :A <- lmn - A op :F ;
"-" <- unary :"neg" ; "~" <- unary :"inv" ; "!" <- unary :"not" ;
pre :preop :F :A <- lmn - A F; post :postop :F :A <- lmn - A F;
"--" <- postop :{ op:'postdec' }; "++" <- postop :{ op:'postinc' };
"--" <- preop :{ op:'predec' }; "++" <- preop :{ op:'preinc' };