Skip to content

qnbhd/pygo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

23 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PYGO - Python-based go-superset-compiler

Logotype

License

Запуск

Для того, чтобы скомпилировать программу необходимо запустить 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).

Разработчики

qnbhdTheXaver

Лицензия

GNU GPLv3

Copyright (c) 2020 Konstantin Templin & Andrei Gavrilov

About

my python-based go-compiler

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •