formalang/README.md
2021-10-12 17:54:14 +03:00

2.2 KiB
Raw Permalink Blame History

Formalang

#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;

так можно подключить все что есть в моей программе.

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)); // В регулярку

Такой вывод в регулярку как показано в прошлом примере сделает много лишних скобок, если мы хотим привести к более нормальному виду, то можно сделать так

RegularTree(reg).ToString() // Получится более красивая регулярка

Про сами регулярки + * - это плюс и звезда Клини. Их можно писать после слов, или после скобок. abacaba* ~ (abacaba)*. a(b)a* ~ a(b)(a)*. Для сложения языков используется |. Символом пустого слова является пробел.

Очень важное отличие, что у меня + * привязываются не к букве, а к слову(например aba* это (aba)*, а не ab(a)* как вы ожидаете), это значительное отличие от существующих регулярок, но .ToString у RegularTree всегда + * выдаст строку у которой перед + * будет стоять скобочка

Примеры регулярок

a*

a(b)+a

(a|b)*