formalang/README.md

44 lines
2.2 KiB
Markdown
Raw Permalink Normal View History

2021-10-06 08:11:51 +00:00
# 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() // Получится более красивая регулярка
```
Про сами регулярки + * - это плюс и звезда Клини. Их можно писать после слов, или после скобок.
2021-10-12 14:54:14 +00:00
abacaba\* ~ (abacaba)\*. a(b)a\* ~ a(b)(a)\*. Для сложения языков используется |. Символом пустого слова является пробел.
Очень важное отличие, что у меня + \* привязываются не к букве, а к слову(например aba* это (aba)\*, а не ab(a)\* как вы ожидаете), это значительное отличие от существующих регулярок, но .ToString у RegularTree всегда + \* выдаст строку у которой перед + \* будет стоять скобочка
2021-10-06 08:11:51 +00:00
Примеры регулярок
a*
a(b)+a
(a|b)*