# Formalang ```c++ #include "regular/RegularTree.hpp" #include "NFA/NFAGraph.hpp" #include "DFA/DFAGraph.hpp" #include "converters/RegularToNFA.hpp" #include "converters/NFAToDFA.hpp" #include "converters/DFAToFDFA.hpp" #include "converters/DFAToMinDFA.hpp" #include "converters/DFAToRegular.hpp" #include "converters/InvertFDFA.hpp" using namespace regular; using namespace NFA; using namespace DFA; using namespace converters; ``` так можно подключить все что есть в моей программе. ```c++ RegularTree r("a*"); // Регулярное выражение NFAGraph NFA_tree = RegularToNFAGraph(std::move(r)); // В НКА DFAGraph DFA_graph = NFAGraphToDFAGraph(std::move(NFA_tree)); // В ДКА DFA_graph = DFAGraphToMinDFAGraph(std::move(DFA_graph)); // Минимизация DFA_graph.Print(); // Мой вывод DFA_graph.CreateDotFile("2.dot"); // Вывод в dot файл std::string reg = DFAGraphToRegular(std::move(DFA_graph)); // В регулярку ``` Такой вывод в регулярку как показано в прошлом примере сделает много лишних скобок, если мы хотим привести к более нормальному виду, то можно сделать так ```c++ RegularTree(reg).ToString() // Получится более красивая регулярка ``` Про сами регулярки + * - это плюс и звезда Клини. Их можно писать после слов, или после скобок. abacaba\* ~ (abacaba)\*. a(b)a\* ~ a(b)(a)\*. Для сложения языков используется |. Символом пустого слова является пробел. Очень важное отличие, что у меня + \* привязываются не к букве, а к слову(например aba* это (aba)\*, а не ab(a)\* как вы ожидаете), это значительное отличие от существующих регулярок, но .ToString у RegularTree всегда + \* выдаст строку у которой перед + \* будет стоять скобочка Примеры регулярок a* a(b)+a (a|b)*