Instructions

V jeziku LANG’24 nadomestimo pravilo za klic funkcije s pravilom

Spremenite prevajalnik, da upošteva to pravilo.

Test

fun putint(c: int): void  
fun putchar(c: char): void  
fun puts(s: ^char): void  
  
fun f(c: int): int =  
    putint(c),  
    putchar('\0x0A'),  
    return c  
  
fun g(c1: int, c2: int, c3: int, c4: int): void =  
    putchar('\0x0A'),  
    puts("Parameters:"), putchar('\0x0A'),  
    putint(c1),  
    putchar('\0x0A'),  
    putint(c2),  
    putchar('\0x0A'),  
    putint(c3),  
    putchar('\0x0A'),  
    putint(c4)  
  
fun main(): int =  
    puts("Argument evaluation:"), putchar('\0x0A'),  
    g(f(3), f(2), f(1), f(4)),  
    return 0

Out

Before

Argument evaluation:
3
2
1
4

Parameters:
3
2
1
4

After

Argument evaluation:
1
2
3
4

Parameters:
3
2
1
4

Code

public class LinearizeImc implements IMC.FullVisitor<IMC.Expr, LinearizeImc.Info> {
    // ... other code ...
 
    @Override
    public IMC.Expr visit(IMC.CALL call, Info info) {
        info.allowCall = false;
 
		// ... other code ...
        
// --- CHANGED ---
		// Arguments: from second-to-last to first, then last  
		for (int i = argsCount-1; i > 0; i--) {  
		    evaluatedArgs[i-1] = call.args.get(i).accept(this, info);  
		}  
		if (argsCount > 0)  
		    evaluatedArgs[argsCount-1] = call.args.get(argsCount).accept(this, info);
			
		// ... other code ...
	}
 
	    // ... other code ...
}