Для того, чтобы скомпилировать программу необходимо запустить main.py с двумя параметрами:
- SourceFile - файл с кодом
- ProgramName - название программы
python main.py SourceFile ProgramName
Пример запуска:
python main.py example.go Prog1
Результат работы компилятора будет создан в папке projects с именем вашей программы.
- В папке bin находится файл ассемблера, исполняемый файл программы и obj-файл.
- В папке logs находятся сведения от
- Лексера (файл lex) cо списком токенов, которые он смог получить
- Парсера (файл ast) с абстрактным синтаксическим деревом
- Таблицы переменных (файл vars)
Производится лексический анализ входного файла и разбиение его на токены.
- Распознаёт практически все лексемы языка Go
- Не реализована поддержка комментариев
На вход поступает список токенов, созданных лексическим анализатором. По правилам языка и списку токенов строится абстрактное синтаксическое дерево (AST)
Пример AST:
+-PROGRAM
+-STATEMENT_LIST
+-STATEMENT_LIST
+-PACKAGE 'main'
+-STATEMENT_LIST
+-STATEMENT_LIST
+-STATEMENT_LIST
+-SET
+-VARIABLE_DECLARATION 'b'
+-INTEGER_CONST '5'
+-SET
+-VARIABLE_DECLARATION 'c1'
+-INTEGER_CONST '6'
+-FOR
+-SET
+-VARIABLE_DECLARATION 'i'
+-INTEGER_CONST '0'
+-LESS
+-USING_VARIABLE 'i'
+-INTEGER_CONST '10'
+-SET
+-USING_VARIABLE 'i'
+-ADD
+-USING_VARIABLE 'i'
+-INTEGER_CONST '1'
+-STATEMENT_LIST
+-PRINT
+-USING_VARIABLE 'i'
построенного по программе
package main
import (
"fmt"
)
func main() {
b := 5
c1 := 6
for i:=0; i < 10; i = i + 1 {
fmt.Print(i)
}
}
Парсер распознаёт следующие конструкции:
-
Математические выражения, операторы
+, -, *, /
-
Цикл for
for <assignment>; <condition>; <assignment>
{
// code
}
- Условия if-else
if <condition> {
// code
} else {
// code
}
- Оператор вывода
fmt.Print()
- Тип всего один - число, указания типов также нет
- Операторы package, import сделаны формально для корректности программ на входном языке
Принимает на вход построенное AST-дерево и строит по нему комманды макроассемблера (MASM32).
GNU GPLv3
Copyright (c) 2020 Konstantin Templin & Andrei Gavrilov