I've managed to get all of the functions from the compiler part, unit part, and declaration part to the point of compiling and linking; with still a lot of work remaining on the body part, which is still another 2000 lines, which mainly need WITH statements fixed up, as well as figuring out exactly how I am going to deal with the fact that PASCAL allows nested procedures, but C/C++, of course, does not. Do I pass a pointer to any variables that I need to share from the nesting to the nested functions, - or is there a more elegant way that will work out better in the end; like if there is a sneaky way to use C++ nested classes (!) - which might work out really nicely if I could figure out how to use "placement new" to construct an instance of a virtual derived class which might somehow encapsulate an instance of an existing base object. Now THAT would be nice.
![](https://cdn.hackaday.io/images/1965921658089296682.png)
This method seems to work fairly straightforwardly. Just derive DECLARATIONPART from PASCALCOMPILER and use a constructor that copies all of the member variables from the nesting class to the nested class, which is only about 2800 or so bytes, since a lot of stuff is in linked lists or tree structures, and we really only need to borrow a copy of the master pointers.
DECLARATIONPART::DECLARATIONPART(COMPILERDATA *ptr)
{
size_t sz = sizeof(COMPILERDATA);
COMPILERDATA *ptr2;
ptr2 = (COMPILERDATA*)this;
memcpy(ptr2,ptr,sz);
}
Now for something REALLY weird! Why not just construct an object and then call a member function of that class by dereferencing the constructor, that is, without ever giving the object a name. Apparently anonymous objects are allowed, but it would be nice if they looked a little prettier.
if (!(options.INMODULE&&(SY==ENDSY)))
{
CERROR(6);
SKIP(FSYS);
DECLARATIONPART(this).MAIN(FSYS);
}
Or maybe use placement new to construct the derived class on top of the existing object hierarchy, overwriting the stack in the process, but perhaps figuring out a way to make the stack "look" exactly what it would look like, that is if C/C++ allowed nested procedures. There is also the "alloca" method of reserving space on the stack, then perhaps manipulating object trees over that - which brings me back to placement new. Yet for now - the method of copying the whole base object seems to work well enough to get me into debugging the declaration part - and hopefully sooner than never, I will actually be generating some code files that can actually be run.
Discussions
Become a Hackaday.io Member
Create an account to leave a comment. Already have an account? Log In.