GithubHelp home page GithubHelp logo

regex-practice's Introduction

Практикум по Формальным языкам и трансляциям

Кочуков Максим, группа 597

Задача

Даны a и буква x, Найти максимальное К такое, что в L есть слова, заканчивающиеся на x^К

Алгоритм

  1. Проверить выражение на валидность
  • Состоит из символов a,b,c,1,+,*,.
  • В случае возникновения несостыковок в дальнейшем алгоритм также возвращает ошибку(Например остался лишний символ, не конкатенированный к основной части)
  1. Перевести выражение в Token'ы
  • Токены имеют тип:
    • Операнд(бинарный или унарный в случае * )
    • НКА Автомат, представленный в виде графа, где вершины – состояния, а ребра – однобуквенные переходы либо эпсилон переходы
  • Любой символ X из a,b,c,1 переходит в автомат вида o---X--->o
  1. Приведение всех токенов в один НКА
  • Приведение происходит с с использованием стека(оптимальный вариант для обратной польской записи)
  • Конкатинация(AB.)
    • Из всех терминальных состояний А добавляется эпсилон переход в начальное состояние B
    • Все терминальные состаяния А перестают таковыми быть
    • Терминальным состояниям A присваивается список терманальных состояний B
    • В итоге получается модифицированный автомат A, по факту являющийся AB.
  • Звезда(Клини*)
    • Добавляется новое состояние, из него эпислон переход в старое начальное, новое состояние становится начальным
    • Добавляются эпсилон переходы из всех терминальных состояний в новое начальное
    • Терминальное состояние одно - новое начальное состояние
  • Cложение? (AB+)
    • Создается новое состояние x
    • добавляются эпсилон переходы из x в начальные состояния A и B
    • Начальным состоянием А делается X
    • К терминальным состояниям A добавляются терминальные состояния B
    • Так же как и с конкатинацией, все изменения остаются в А
  • После завершения операции результат добавляется на вершину стека
  1. Поиск ответа на задачу производится при помощи рекуривного DFS из всех терминальных состояний в направлении, обратном обычному направлению переходов исключительно по ребрам, обозначенным необходимой буквой или эпсилон
  • Ведется список посещенных вершин для предотвращения бесконечных циклов. Также, если мы уже имеем хотя бы один не эпсилон переход в истории и натыкаемся на вершину, в которой мы уже были, то это означает наличие бесконечного цикла и на экран выводится INF
  • В случае отсутствия бесконечных циклов на экран выводится максимальная глубина, на которую удалось пройти без учета пройденных эпсилон переходов

Код(При разработке использовался Python 3.5.2 )

class Vertex: # Вершина графа
    def addTo(self,letter,vrtx): # добавление связи с другой вершиной
    def goBackWithLetter(self,let, depth, beento): # рекурсивный обход против направления ребер
class AutomatEntry: # Класс НКА
    def __init__(self, letter): # Задаестя начальное состояние, список конечных состояний. После выполнения этого метода НКА имеет вид o---letter--->o
    def concat(self, am): # конкатинация с другим автоматом
    def plus(self,am): # Сложение с другим автоматом
    def star(self): # Звезда клини над этим автоматом
class Token: # Класс токена для удобства лексического разбора строки
    def __init__(self,let):
class mRegex: # Главный класс для работы с регулярными выражениями
    def __init__(self,expression): # Инициализация по выражению
    def prepareRE(self): # Первоначальная проверка на валидность, удаление пробельных символов
    def tokenize(self): #  Перевод символов в токены
    def generateAutomat(self): # Генерация одного автомата из всех токенов
    def getMaxLen(self,letter): # Поиск ответа на поставленную задачу при помощи описанного выше алгоритма

regex-practice's People

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.