|
@@ -25,11 +25,11 @@
|
|
|
TNODE
|
|
|
****************************************************************************}
|
|
|
|
|
|
- constructor tnode.init(tt : tnodetype);
|
|
|
+ constructor tnode.create(tt : tnodetype);
|
|
|
|
|
|
begin
|
|
|
- inherited init;
|
|
|
- treetype:=tt;
|
|
|
+ inherited create;
|
|
|
+ nodetype:=tt;
|
|
|
{ this allows easier error tracing }
|
|
|
location.loc:=LOC_INVALID;
|
|
|
{ save local info }
|
|
@@ -44,7 +44,7 @@
|
|
|
flags:=[];
|
|
|
end;
|
|
|
|
|
|
- destructor tnode.done;
|
|
|
+ destructor tnode.destroy;
|
|
|
|
|
|
begin
|
|
|
{ reference info }
|
|
@@ -57,7 +57,7 @@
|
|
|
{$endif EXTDEBUG}
|
|
|
end;
|
|
|
|
|
|
- procedure tnode.pass_1;
|
|
|
+ function tnode.pass_1 : tnode;
|
|
|
|
|
|
begin
|
|
|
if not(assigned(resulttype)) then
|
|
@@ -66,36 +66,19 @@
|
|
|
det_temp;
|
|
|
end;
|
|
|
|
|
|
- procedure tnode.det_resulttype;
|
|
|
-
|
|
|
- begin
|
|
|
- abstract;
|
|
|
- end;
|
|
|
-
|
|
|
- procedure tnode.det_temp;
|
|
|
-
|
|
|
- begin
|
|
|
- abstract;
|
|
|
- end;
|
|
|
-
|
|
|
- procedure tnode.secondpass;
|
|
|
-
|
|
|
- begin
|
|
|
- abstract;
|
|
|
- end;
|
|
|
-
|
|
|
procedure tnode.concattolist(l : plinkedlist);
|
|
|
|
|
|
begin
|
|
|
- l^.concat(@self);
|
|
|
+{$ifdef newcg}
|
|
|
+ l^.concat(self);
|
|
|
+{$endif newcg}
|
|
|
end;
|
|
|
|
|
|
- function tnode.ischild(p : pnode) : boolean;
|
|
|
+ function tnode.ischild(p : tnode) : boolean;
|
|
|
|
|
|
begin
|
|
|
ischild:=false;
|
|
|
end;
|
|
|
-
|
|
|
{$ifdef EXTDEBUG}
|
|
|
procedure tnode.dowrite;
|
|
|
|
|
@@ -186,36 +169,49 @@
|
|
|
end;
|
|
|
{$endif EXTDEBUG}
|
|
|
|
|
|
- function tnode.isequal(p : node) : boolean;
|
|
|
+ function tnode.isequal(p : tnode) : boolean;
|
|
|
|
|
|
begin
|
|
|
- isequal:=assigned(p) and (p^.nodetype=nodetype) and
|
|
|
- (flags*flagsequal=p^.flags*flagsequal) and
|
|
|
+ isequal:=assigned(p) and (p.nodetype=nodetype) and
|
|
|
+ (flags*flagsequal=p.flags*flagsequal) and
|
|
|
docompare(p);
|
|
|
end;
|
|
|
|
|
|
- function tnode.docompare(p : pnode) : boolean;
|
|
|
+ function tnode.docompare(p : tnode) : boolean;
|
|
|
|
|
|
begin
|
|
|
docompare:=true;
|
|
|
end;
|
|
|
|
|
|
+ procedure tnode.set_file_line(from : tnode);
|
|
|
+
|
|
|
+ begin
|
|
|
+ if assigned(from) then
|
|
|
+ fileinfo:=from.fileinfo;
|
|
|
+ end;
|
|
|
+
|
|
|
+ procedure tnode.set_tree_filepos(const filepos : tfileposinfo);
|
|
|
+
|
|
|
+ begin
|
|
|
+ fileinfo:=filepos;
|
|
|
+ end;
|
|
|
+
|
|
|
{****************************************************************************
|
|
|
TUNARYNODE
|
|
|
****************************************************************************}
|
|
|
|
|
|
- constructor tunarynode.init(tt : tnodetype;l : pnode);
|
|
|
+ constructor tunarynode.create(tt : tnodetype;l : tnode);
|
|
|
|
|
|
begin
|
|
|
- inherited init(tt);
|
|
|
+ inherited create(tt);
|
|
|
left:=l;
|
|
|
end;
|
|
|
|
|
|
- function tunarynode.docompare(p : pnode) : boolean;
|
|
|
+ function tunarynode.docompare(p : tnode) : boolean;
|
|
|
|
|
|
begin
|
|
|
docompare:=(inherited docompare(p)) and
|
|
|
- left^.isequal(p^.left);
|
|
|
+ left.isequal(tunarynode(p).left);
|
|
|
end;
|
|
|
|
|
|
{$ifdef extdebug}
|
|
@@ -233,12 +229,12 @@
|
|
|
procedure tunarynode.concattolist(l : plinkedlist);
|
|
|
|
|
|
begin
|
|
|
- left^.parent:=@self;
|
|
|
- left^.concattolist(l);
|
|
|
+ left.parent:=self;
|
|
|
+ left.concattolist(l);
|
|
|
inherited concattolist(l);
|
|
|
end;
|
|
|
|
|
|
- function tunarynode.ischild(p : pnode) : boolean;
|
|
|
+ function tunarynode.ischild(p : tnode) : boolean;
|
|
|
|
|
|
begin
|
|
|
ischild:=p=left;
|
|
@@ -247,23 +243,23 @@
|
|
|
procedure tunarynode.det_resulttype;
|
|
|
|
|
|
begin
|
|
|
- left^.det_resulttype;
|
|
|
+ left.det_resulttype;
|
|
|
end;
|
|
|
|
|
|
procedure tunarynode.det_temp;
|
|
|
|
|
|
begin
|
|
|
- left^.det_temp;
|
|
|
+ left.det_temp;
|
|
|
end;
|
|
|
|
|
|
{****************************************************************************
|
|
|
TBINARYNODE
|
|
|
****************************************************************************}
|
|
|
|
|
|
- constructor tbinarynode.init(tt : tnodetype;l,r : pnode);
|
|
|
+ constructor tbinarynode.create(tt : tnodetype;l,r : tnode);
|
|
|
|
|
|
begin
|
|
|
- inherited init(tt,l);
|
|
|
+ inherited create(tt,l);
|
|
|
right:=r
|
|
|
end;
|
|
|
|
|
@@ -272,14 +268,14 @@
|
|
|
begin
|
|
|
{ we could change that depending on the number of }
|
|
|
{ required registers }
|
|
|
- left^.parent:=@self;
|
|
|
- left^.concattolist(l);
|
|
|
- left^.parent:=@self;
|
|
|
- left^.concattolist(l);
|
|
|
+ left.parent:=self;
|
|
|
+ left.concattolist(l);
|
|
|
+ left.parent:=self;
|
|
|
+ left.concattolist(l);
|
|
|
inherited concattolist(l);
|
|
|
end;
|
|
|
|
|
|
- function tbinarynode.ischild(p : pnode) : boolean;
|
|
|
+ function tbinarynode.ischild(p : tnode) : boolean;
|
|
|
|
|
|
begin
|
|
|
ischild:=(p=right) or (p=right);
|
|
@@ -288,45 +284,146 @@
|
|
|
procedure tbinarynode.det_resulttype;
|
|
|
|
|
|
begin
|
|
|
- left^.det_resulttype;
|
|
|
- right^.det_resulttype;
|
|
|
+ left.det_resulttype;
|
|
|
+ right.det_resulttype;
|
|
|
end;
|
|
|
|
|
|
procedure tbinarynode.det_temp;
|
|
|
|
|
|
begin
|
|
|
- left^.det_temp;
|
|
|
- right^.det_temp;
|
|
|
+ left.det_temp;
|
|
|
+ right.det_temp;
|
|
|
+ end;
|
|
|
+
|
|
|
+ function tbinarynode.docompare(p : tnode) : boolean;
|
|
|
+
|
|
|
+ begin
|
|
|
+ docompare:=left.isequal(tbinarynode(p).left) and
|
|
|
+ right.isequal(tbinarynode(p).right);
|
|
|
+ end;
|
|
|
+
|
|
|
+ function tbinarynode.isbinaryoverloaded(var t : tnode) : boolean;
|
|
|
+
|
|
|
+ var
|
|
|
+ rd,ld : pdef;
|
|
|
+ optoken : ttoken;
|
|
|
+
|
|
|
+ begin
|
|
|
+ t:=nil;
|
|
|
+ isbinaryoverloaded:=false;
|
|
|
+ { overloaded operator ? }
|
|
|
+ { load easier access variables }
|
|
|
+ rd:=right.resulttype;
|
|
|
+ ld:=left.resulttype;
|
|
|
+ if isbinaryoperatoroverloadable(ld,rd,voiddef,nodetype) then
|
|
|
+ begin
|
|
|
+ isbinaryoverloaded:=true;
|
|
|
+ {!!!!!!!!! handle paras }
|
|
|
+ case nodetype of
|
|
|
+ { the nil as symtable signs firstcalln that this is
|
|
|
+ an overloaded operator }
|
|
|
+ addn:
|
|
|
+ optoken:=_PLUS;
|
|
|
+ subn:
|
|
|
+ optoken:=_MINUS;
|
|
|
+ muln:
|
|
|
+ optoken:=_STAR;
|
|
|
+ starstarn:
|
|
|
+ optoken:=_STARSTAR;
|
|
|
+ slashn:
|
|
|
+ optoken:=_SLASH;
|
|
|
+ ltn:
|
|
|
+ optoken:=tokens._lt;
|
|
|
+ gtn:
|
|
|
+ optoken:=tokens._gt;
|
|
|
+ lten:
|
|
|
+ optoken:=_lte;
|
|
|
+ gten:
|
|
|
+ optoken:=_gte;
|
|
|
+ equaln,unequaln :
|
|
|
+ optoken:=_EQUAL;
|
|
|
+ symdifn :
|
|
|
+ optoken:=_SYMDIF;
|
|
|
+ modn :
|
|
|
+ optoken:=_OP_MOD;
|
|
|
+ orn :
|
|
|
+ optoken:=_OP_OR;
|
|
|
+ xorn :
|
|
|
+ optoken:=_OP_XOR;
|
|
|
+ andn :
|
|
|
+ optoken:=_OP_AND;
|
|
|
+ divn :
|
|
|
+ optoken:=_OP_DIV;
|
|
|
+ shln :
|
|
|
+ optoken:=_OP_SHL;
|
|
|
+ shrn :
|
|
|
+ optoken:=_OP_SHR;
|
|
|
+ else
|
|
|
+ exit;
|
|
|
+ end;
|
|
|
+ t:=gencallnode(overloaded_operators[optoken],nil);
|
|
|
+ { we have to convert p^.left and p^.right into
|
|
|
+ callparanodes }
|
|
|
+ if tcallnode(t).symtableprocentry=nil then
|
|
|
+ begin
|
|
|
+ CGMessage(parser_e_operator_not_overloaded);
|
|
|
+ t.free;
|
|
|
+ end
|
|
|
+ else
|
|
|
+ begin
|
|
|
+ inc(tcallnode(t).symtableprocentry^.refs);
|
|
|
+ tcallnode(t).left:=gencallparanode(left,nil);
|
|
|
+ tcallnode(t).left:=gencallparanode(right,tcallnode(t).left);
|
|
|
+ if nodetype=unequaln then
|
|
|
+ t:=cnotnode.create(t);
|
|
|
+
|
|
|
+ firstpass(t);
|
|
|
+
|
|
|
+ putnode(p);
|
|
|
+ p:=t;
|
|
|
+ end;
|
|
|
+ end;
|
|
|
end;
|
|
|
|
|
|
- function tbinarynode.docompare(p : pnode) : boolean;
|
|
|
+ procedure tbinarynode.swapleftright;
|
|
|
+
|
|
|
+ var
|
|
|
+ swapp : tnode;
|
|
|
|
|
|
begin
|
|
|
- docompare:=left^.isequal(p^.left) and
|
|
|
- right^.isequal(p^.right);
|
|
|
+ swapp:=right;
|
|
|
+ right:=left;
|
|
|
+ left:=swapp;
|
|
|
+ if nf_swaped in flags then
|
|
|
+ exclude(flags,nf_swaped)
|
|
|
+ else
|
|
|
+ include(flags,nf_swaped);
|
|
|
end;
|
|
|
|
|
|
{****************************************************************************
|
|
|
TBINOPYNODE
|
|
|
****************************************************************************}
|
|
|
|
|
|
- constructor tbinopnode.init(tt : tnodetype;l,r : pnode);
|
|
|
+ constructor tbinopnode.create(tt : tnodetype;l,r : tnode);
|
|
|
|
|
|
begin
|
|
|
- inherited init(tt,l,r);
|
|
|
+ inherited create(tt,l,r);
|
|
|
end;
|
|
|
|
|
|
- function tbinopnode.docompare(p : pnode) : boolean;
|
|
|
+ function tbinopnode.docompare(p : tnode) : boolean;
|
|
|
|
|
|
begin
|
|
|
docompare:=(inherited docompare(p)) or
|
|
|
((nf_swapable in flags) and
|
|
|
- left^.isequal(p^.right) and
|
|
|
- right^.isequal(p^.left));
|
|
|
+ left.isequal(tbinopnode(p).right) and
|
|
|
+ right.isequal(tbinopnode(p).left));
|
|
|
end;
|
|
|
{
|
|
|
$Log$
|
|
|
- Revision 1.1 2000-08-26 12:27:17 florian
|
|
|
- * initial release
|
|
|
+ Revision 1.2 2000-09-20 21:52:38 florian
|
|
|
+ * removed a lot of errors
|
|
|
+
|
|
|
+ Revision 1.1 2000/08/26 12:27:17 florian
|
|
|
+ * createial release
|
|
|
|
|
|
}
|