Skip to main content

Library for automatic construction of lexers

Project description

ParseBuillder

О синтаксисе

ParseBuilder - библиотека для автоматического построения базовых парсеров для интерпретаторов. Пока что библиотека строит парсеры лишь на Python, но в будущем планируется расширение функционала в виде поддаржки таких языков, как: C++, Go, Java/Kotlin. Для построения лексера можно воспользоваться библиотекой LexBuilder.

Примеры

from ParseBuilder.Builder import PyBuilder


parser = PyBuilder()
parser.build()
from Lexer import *


class Parser:
    def __init__(self, lexer, symbol_table):
        '''
        Конструктор класса Parser.

        Параметры:
        - lexer: экземпляр класса Lexer для токенизации входного текста.
        - symbol_table: экземпляр класса SymbolTable для отслеживания переменных.

        symbol_table - объект класса SymbolTable, используется для
        хранения и управления переменными.
        '''
        self.lexer = lexer
        self.current_token = self.lexer.get_next_token()
        self.symbol_table = symbol_table

    def eat(self, token_type):
        '''
        Функция проверяет текущий токен и токен, с которого
        мы хотим перейти на другой токен.
        То есть у нас не получиться будучи на Token(VAR, "x") перейти на
        следущий токен с того, которого мы передаём в функцию:
        Текущий токен: VAR, мы передали в функцию токен PRINT -
        получаем ошибку, потому что мы находимся на токене VAR, а хотим перейти
        на следующий токен с токена PRINT.
        '''
        if self.current_token.type == token_type:
            self.current_token = self.lexer.get_next_token()
        else:
            raise Exception(f"Error eating {self.current_token.type} token!")

    def factor(self):
        '''
        Функция отвечает за использование встроенных функций языка или других
        токенов которые возвращают значения:
        ... = input()
        ... = int(x)
        ... = True
        '''
        token = self.current_token
        if token.type == INT_NUMBER:
            self.eat(INT_NUMBER)
            return int(token.value)
        elif token.type == FLOAT_NUMBER:
            self.eat(INT_NUMBER)
            return float(token.value)
        elif token.type == STRING:
            string_value = token.value
            self.eat(STRING)
            return string_value
        elif token.type == VAR:
            var_name = token.value
            self.eat(VAR)
            return self.symbol_table.lookup(var_name)

    def term(self):
        '''
        Обработка терма (произведения или частного).

        Возвращает:
        - Результат вычисления терма.
        '''
        result = self.factor()

        while self.current_token.type in (MULTIPLY, DIVIDE):
            token = self.current_token
            if token.type == MULTIPLY:
                self.eat(MULTIPLY)
                result *= self.factor()
            elif token.type == DIVIDE:
                self.eat(DIVIDE)
                result /= self.factor()

        return result

    def expr(self):
        '''
        Обработка выражения (суммы или разности).

        Возвращает:
        - Результат вычисления выражения.
        '''
        result = self.term()

        while self.current_token.type in (PLUS, MINUS):
            token = self.current_token
            if token.type == PLUS:
                self.eat(PLUS)
                result += self.term()
            elif token.type == MINUS:
                self.eat(MINUS)
                result -= self.term()

        return result

    def statement(self):
        '''
        Функция отвечает за встроенные функции и конструкции,
        которые не возвращают значения:
          print ...
          var = ...
          if ...

        '''
        if self.current_token.type == VAR:
            var_name = self.current_token.value
            self.eat(VAR)
            if self.current_token.type == ASSIGN:
                self.eat(ASSIGN)
                value = self.expr()
                self.symbol_table.define(var_name, value)
            else:
                sys.exit()

        else:
            self.current_token = self.lexer.get_next_token()

    def parse(self):
        '''
        Парсинг входного текста и выполнение выражений.

        Эта функция запускает парсинг входного текста и последовательно выполняет
        выражения, включая присваивание переменных и вывод значений.
        '''
        while self.current_token.type != EOF:
            self.statement()

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

parsebuilder-1.0.0.tar.gz (4.1 kB view hashes)

Uploaded Source

Built Distribution

ParseBuilder-1.0.0-py3-none-any.whl (5.9 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page