// ***************************** d language analyser back end: testing *************************
// ********* (c) Copyright Peri Hankey 2005. Distribution licensed under GNU GPLv2 ***********
.d()
main units compile <- eof;
eof <- units eof ;
- unit compile <- units - ;
"module" modulename :N ";" modout compile units <- units;
- <- modout module :N eoc code;
.d(1010R)
- code <- compile ;
- out <- code - ;
- out <- output - ;
eof <- compile eof;
eol <- code - nl ;
eoc <- code - "; " nl ;
indent:Space code <- code - ;
nl <- code - '\n' Space ;
sp checks <- code - ;
comma checkc <- code - ;
- <- checks ' ' ;
eoc <- checks eoc ;
";" <- checks ";" ;
"; " <- checks "; ";
"]" <- checks "]" ;
")" <- checks ")" ;
- <- checkc ", ";
";" <- checkc ";";
"; " <- checkc "; ";
"]" <- checkc "]";
"}" <- checkc nl "}";
")" <- checkc ")";
eoc <- checkc eoc ;
st <- checkc st ;
unit :X <- code - X ;
op :X <- code - X sp ;
st :X <- code - sp "{" indent :{ Space " " } nl X "}" code nl ;
sq :X <- code - '\'' X '\'' ;
dq :X <- code - '\"' X '\"' ;
ty :X <- code - X ;
sy :X <- code - X ;
nm :X <- code - X ;
module :N <- code - "module " N ;
import :N <- code - "import " N ;
prag <- code - ":" nl ;
xpragma :N :P :X <- code - "pragma(" N comma P ")" X ;
xdebug :D :S :A <- code - "debug " D S A ;
debugarg :X <- code - "(" X ")" ;
alt :A <- code - "else " A ;
xversion :V :S :A <- code - "version(" V ") " S A ;
xmixin :T :A :M <- code - "mixin " T A M ;
mixargs :A <- code - "!(" A ")" ;
linkage :L <- code - "(" L ") " ;
extern :L :D <- code - "extern " L D ;
declare :T :A :S :N <- code - T A sp N S comma ;
initdecl:T :A :S :N :E <- code - T A sp N S sp "=" sp E comma ;
prot :P :D <- code - P sp D ;
storageclass :X :D <- code - sc:X D ;
sc :X <- code - X sp ;
sc :X define :T :A :S :N :B <- code - nl X sp T A sp N S st:B ;
sc :X cdefine :T :A :S :N :B <- code - nl X sp T A sp N S nl B ;
define :T :A :S :N :B <- code - nl T A sp N S st:B ;
cdefine :T :A :S :N :B <- code - nl T A sp N S nl B ;
struct :N :T :B <- code - nl "struct " N T st:B ;
union :N :T :B <- code - nl "union " N T st:B ;
enum0 :B <- code - nl "enum" B nl ;
enum1 :N :T :B <- code - nl "enum" sp N B nl ;
classdef :N :T :H :B <- code - nl "class " N H T st :B ;
interfacedef :N :T :H :B <- code - nl "interface " N H T st :B ;
template :N :T :B <- code - nl "template " N "(" T ")" st :B ;
ctor :P :B <- code - nl "this(" P ")" st :B;
dtor :P :B <- code - nl "~this(" P ")" st :B;
staticCtor :P :B <- code - nl "static " "this" "(" P ")" st :B ;
staticDtor :P :B <- code - nl "static " "~" "this" "(" P ")" st :B ;
classallocator :P :B <- code - nl "new" "(" P ")" st :B ;
classdeallocator :P :B <- code - nl "delete" "(" P ")" st :B ;
classinvariant :B <- code - nl "invariant" st :B ;
utest :B <- code - nl "unittest" st :B ;
staticassert :E <- code - "static assert(" E ")" eoc;
decl :N <- code - N comma ;
init :N :E <- code - N sp "=" sp E comma ;
typename:A <- code - A ;
typedef :A <- code - "typedef " A ;
alias :A <- code - "alias " A ;
tparamA :T :S <- code - "alias " T S comma ;
tparamT :T :S <- code - T S comma ;
tparamV :T :D :N :I <- code - T D sp N I comma ;
tb :D <- code - "(" D ")" ;
star <- code - "*" ;
row <- code - "[]" ;
row <- code - "[]" ;
dim :E <- code - "[" E "]" ;
aaa :T <- code - "[" T "]" ;
xdelegate :P <- code - sp "delegate(" P ")" ;
xfunction :P <- code - sp "function(" P ")" ;
fun :P <- code - "(" P ")" ;
types :T <- code - "(" T ")" ;
formal0 :T :D :N <- code - T D sp N comma ;
formal1 :M :T :D :N <- code - M sp T D sp N comma ;
param0 :T :D :N :I <- code - T D sp N I ;
param1 :M :T :D :N :I <- code - M sp T D sp N I ;
varargs <- code - "..." ;
iParam :E <- code - sp "=" sp E ;
dParam <- code - comma ;
enumbody :B <- code - st :B nl ;
enumdecl <- code - eoc ;
iEnum :E <- code - sp "=" sp E comma ;
dEnum <- code - comma ;
supers :S <- code - " : " S ;
superface :N <- code - N comma ;
superclass :N <- code - N comma ;
xif :E :A :B <- code - "if(" E ")" A B ;
xdo :E :B <- code - "do" B "while(" E ")" eoc ;
xwhile :E :B <- code - "while(" E ")" B ;
xfor :I :E :N :B <- code - "for(" I "; " E "; " N ")" B ;
xforeach :I :E :B <- code - "foreach(" I "; " E ")" B ;
xswitch :E :B <- code - "switch(" E ")" st :B ;
xcase :E :S <- code - "case " E ": " S ;
xdefault :S <- code - "default: " S ;
xcont0 <- code - "continue" ;
xcont1 :N <- code - "continue" N ;
xbreak0 <- code - "break" ;
xbreak1 :N <- code - "break" sp N ;
xreturnZ <- code - "return" ;
xreturnE :E <- code - "return" sp E ;
label :N <- code - N ": " ;
xgoName :N <- code - "goto " N ;
xgodefault <- code - "goto default" ;
xgocase0 <- code - "goto case" ;
xgocase1 :E <- code - "goto case" sp E ;
xwithB :X :B <- code - "with(" X ")" st :B ;
xwithN :X :B <- code - "with(" X ")" st :B ;
xwithT :X :B <- code - "with(" X ")" st :B ;
xsync0 :S <- code - "synchronized" st :S ;
xsync1 :E :S <- code - "synchronized(" E ")" st :S ;
xtry :B :C :L :F <- code - "try " B C L F ;
xthrow :E <- code - "throw " E ;
xvolatile :S <- code - ;
finally :B <- code - "finally ";
catch1 :P :B <- code - "catch(" P ")" B ;
catch0 :B <- code - "catch " B ;
xelse :B <- code - "else " B ;
xelsif :E :B :C <- code - "else if(" E ")" B C ;
xelsez <- code - ;
outresult :R <- code - "(" R ")" ;
contract :M :R :B <- code - M R st:B ;
contracts :M :R :B :C :D <- code - M R st:B C D ;
assert :B <- code - "assert(" B ")";
path :P :Q <- code - P'.'Q ;
cast :T :E <- code - "cast(" T ")" E ;
arg :A <- code - A comma ;
br :A <- code - "(" A ")";
fn :F :A <- code - F "(" A ")";
args :A <- code - "(" A ")" ;
"," :A :B <- code - A ", " B ;
"?" :A :B :C <- code - A sp "? " B " : " C ;
fl :F :A :B <- code - A sp F sp B ;
fa :F :A :B <- code - A sp F sp B ;
fa :F :A :B <- code - A sp F sp B ;
fb :F :A :B <- code - A sp F sp B ;
fc :F :A :B <- code - A sp F sp B ;
fe :F :A :B <- code - A sp F sp B ;
fq :F :A :B <- code - A sp F sp B ;
fx :F :A :B <- code - A sp F sp B ;
fs :F :A :B <- code - A sp F sp B ;
ur :dfn :F :A <- code - F A ;
ux :dfn :F :A <- code - F A ;
ub :dfn :F :A <- code - F A ;
aa :dfn :F :A <- code - F sp A ;
pre :dfn :F :A <- code - F A;
post :dfn :F :A <- code - A F;
inc <- dfn :"++" ;
dec <- dfn :"--" ;
neg <- dfn :"-" ;
pos <- dfn :"+" ;
ref <- dfn :"&" ;
deref <- dfn :"*" ;
not <- dfn :"!" ;
inv <- dfn :"~" ;
del <- dfn :"delete";
nu :T :S :A <- code - "new" sp T S A ;
newvec0 <- code - "[]";
newvec1 :B <- code - "[" B "]";
idx0 :A <- code - A "[]";
idx :A :B <- code - A "[" B "]";
sli :A :B :C <- code - A "[" B ".." C "]";
dot :A :B <- code - A "." B ;
anonymous <- code - ;
eachtyp0 :T :A :B :N <- code - T A sp N B comma ;
eachtyp1 :M:T :A :B :N <- code - M sp T A sp N B comma ;
this <- code - 'this' ;
super <- code - 'super';
truth :V <- code - V ;
typeattribute :T :N <- code - T "." N;
typeid :T <- code - "typeid("T")";
typeof :E <- code - "typeof("E")";
templateInstance :A :S <- code - A "!(" S ")" ;
xfunction :T :P :B <- code - "function " T "(" P ")" st :B ;
xdelegate :T :P :B <- code - "delegate " T "(" P ")" st :B ;
structinit :A <- code - "{" A "}" ;
arrayinit :A <- code - "[" A "]" ;
cellN :N :X <- code - N ":" X comma ;
cellV :X <- code - X comma ;
asmblock :A <- code - "asm" st :A ;
asmstat :A <- code - A ;
asmitem :A <- code - A sp ;