inlining of functions could work, but again functions couldn't call other functions without a stack.
as for backward compatibility: not trying to discourage you guys from doing this, but if it's not 100% backwardly compatible I probably just won't use it. With the script as you wrote it, what if I write some code that looks like that but I also have a line that says
#define vCounter v200
instead of
v200 vCounter;
Will the compiler be able to recognize that v200 is already in use?
also, something to mention, that pic data type in the script you wrote would also require a temporary variable, because load.pic(), etc., take var arguments.
How would you implement it such that rooms didn't have to be declared in separate logics? That sounds like more temporary variables to me.
My feelings on this whole issue:
if I can keep my source code exactly as it is right now and the compiler will compile my code and generate absolutely no temporary variables of its own or anything like that, then it's fine if there are extensions that do generate temporaries. However, extensions such as for loops, while loops, switch statements, and object.method syntax would not require temporaries and so they should not generate them. I can understand it if an expression such as 2 + 3 * 7 or v1 = 2 + 2 + v1 generates temporaries, but expressions that are already supported by AGI syntax without temporaries should not generate temporaries. Neither should simple expressions such as v1 = 2 + 2 + 8 + v2. I shouldn't have to give up precise control over what variables are used for what just to use the extensions that I think would be useful. If I did, the new compiler would have no value to me.
By the way, AGIC was written with lex and yacc. If it was well-written, it shouldn't, in theory, be too terribly difficult to modify that. I haven't really taken a good look at it, though.