Семантический анализ для простого языка Compile-C-C
Поэтому я работаю над созданием простого языка компиляции на C, синтаксис которого аналогичен Python. Вот пример исходного кода:
# All comments start with pound signs
# Integer declaration
speed = 4
motor = 69.5
text = "hey + guys!"
junk = 5 +4
# Move function
def move():
speed = speed + 1
print speed
# Main function (program entry)
def main():
localvar = 43.2
move()
if true:
print localvar
Как и Python, язык подчеркивает удобочитаемость с помощью политик отступа. У этого также есть очень свободная система объявления типов. Типы определяются контекстом.
object = 5 // Creates an integer
object_two = "stuff" // Creates a string
object_three = 5.23 // Creates a float
Образец исходного кода, который я имею выше, внутренне представлен как:
[
[
"GLOBAL",
[
"speed = 4",
"motor = 69.5",
"text = \"hey + guys!\"",
"junk = 5 +4"
],
[
"SCOPE",
[
"speed",
"motor",
"text",
"junk"
],
[
"INT",
"FLOAT",
"STRING",
"INT"
],
[
0,
1,
2,
3
]
]
],
[
"def move():",
[
" speed = speed + 1",
" print speed"
],
[
"SCOPE",
[
"speed",
"motor",
"text",
"junk"
],
[
"GLOBAL",
"GLOBAL",
"GLOBAL",
"GLOBAL"
],
[
0,
1,
2,
3
]
]
],
[
"def main():",
[
" localvar = 43.2",
" move()",
" if true:",
" print localvar"
],
[
"SCOPE",
[
"speed",
"motor",
"text",
"junk",
"localvar"
],
[
"GLOBAL",
"GLOBAL",
"GLOBAL",
"GLOBAL",
"FLOAT"
],
[
0,
1,
2,
3,
0
]
]
]
]
Каждая функция упакована в это представление вместе с соответствующими локальными переменными и их типами (а также индекс строки, на которой они объявлены в соответствии с функцией).
Я пытаюсь преобразовать это промежуточное представление в реальный код C (на самом деле это код NXC, поэтому он немного отличается от C).
Мой вопрос заключается в том, как я могу понять типы переменных (в частности, переменные, объявленные в аргументе функции). Единственный способ, которым я могу это сделать, - это угадать, основываясь на контексте, в котором была вызвана функция.
Не говоря уже о том, что я создаю промежуточное представление линейным способом. Что произойдет, если функция определена, но не вызывается до следующего? Придется ли мне делать несколько прогонов, изменяя это промежуточное представление, пока я не получу всю необходимую информацию о типе?