Семантический анализ для простого языка 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).

Мой вопрос заключается в том, как я могу понять типы переменных (в частности, переменные, объявленные в аргументе функции). Единственный способ, которым я могу это сделать, - это угадать, основываясь на контексте, в котором была вызвана функция.

Не говоря уже о том, что я создаю промежуточное представление линейным способом. Что произойдет, если функция определена, но не вызывается до следующего? Придется ли мне делать несколько прогонов, изменяя это промежуточное представление, пока я не получу всю необходимую информацию о типе?

0 ответов

Другие вопросы по тегам