Intro
In this series I am creating a transpiler from Python to Golang called Pogo. In the last post we made the errors so much better, adding line numbers and the function line. In this post we will be fixing functions so that the compiler understands that parameter variables count as declarations.
Current Errors
Here is some sample code.
from GoType import *
def test(x: int):
print(x)
Compiling this gives us this compiler error.
[Analyzer (analyze-call)] An uninitialized variable was used in a function call
Firstly, lets fix this error a bit.
analyze.go -> analyze:ST_CALL -> line: 4
An uninitialized variable was used in a function call
There we go, that's better. So now that we have an uninitialized variable in a function call, we should initialize it.
This is actually pretty easy, as we have looked at initializing variables in declarations, so a lot of the code can be copy pasted.
else if s.code == structureCode["ST_FUNCTION"] {
i := 3
for s.children[i].code == structureCode["IDENTIFIER"] {
n := s.children[i] // IDENTIFIER - name
t := s.children[i+2] // IDENTIFIER - type
v := Variable{n.text, t.text}
vars = append(vars, v)
i += 4 // Next variable, otherwise this will end up on an anti-colon
}
}
We use i
to keep track of the index of the identifier. If i
points to an identifier then we can add it to the slice of variables. By incrementing by 4 we end up on the next identifier to repeat the process. If we're one the last parameter then we will end up overshooting, and we land on the anti-colon. This fixes the errors!
Next
I know that we didn't do too much here, I've been a bit busy, but in the next post we will work on variables when calling a function, because at the moment when we try to put anything in a function call it gives us an error.