
- •Алгоритмы и преобразования.
- •Преобразования формальных грамматик
- •Удаление бесполезных символов
- •Удаление e-правил (пустых правил)
- •Удаление цепных правил
- •Удаление левой рекурсии
- •Алгоритмы над формальными грамматиками
- •Построение множества укорачивающих символов
- •Получение множества перв (First).
- •Получение множества посл (Last).
- •Получение множества След (Follow).
- •Определение принадлежности к классу лл1
- •Алгоритм разбора для лл1 грамматик
- •Построение управляющей таблицы для лл1-анализатора
- •Грамматики предшествования
- •Вычисление матрицы предшествования
- •Определение принадлежности грамматики к классу простого предшествования
- •Определение принадлежности грамматики к классу слабого предшествования
Определение принадлежности грамматики к классу простого предшествования
Класс простого предшествования определяется очень просто: грамматика является грамматикой простого предшествования, если для любых двух символов полного словаря существует не более одного отношения предшествования. Неформально, это значит, что в каждой клетке матрицы предшествования должно находится не более одного отношения.
Проверку производит класс isPrecedence. Этот класс получает матрицу предшествования и по ней определяет является ли она грамматикой простого предшествования.
FormalGrammar::ptr a_fg = new FormalGrammar(a_fileName); cout<<"FG "<<a_fg->toString(); makePrecedenceMatrix a_mpm(); PrecedenceMatrix::ptr a_pm = a_mpm( a_fg ); isPrecedence a_ip; if( a_ip( m_pm ) ) cout<<"Grammar is precedence"; else cout<<"Grammar is not precedence";
Определение принадлежности грамматики к классу слабого предшествования
Класс слабого предшествования определяется чуть сложнее: грамматика является грамматикой слабого предшествования, если отношение > не пересекается с объединением отношений < = и для A::=wXv и B::=v не выполняется ни X < B ни X = B. Неформально, это значит, что в каждой клетке матрицы предшествования могут находиться либо < и = либо только >.
Проверку производит класс isWeakPrecedence. Этот класс получает матрицу предшествования и по ней определяет является ли она грамматикой слабого предшествования.
FormalGrammar::ptr a_fg = new FormalGrammar(a_fileName); cout<<"FG "<<a_fg->toString(); makePrecedenceMatrix a_mpm(); PrecedenceMatrix::ptr a_pm = a_mpm( a_fg ); isWeakPrecedence a_iwp; if( a_iwp( m_pm ) ) cout<<"Grammar is weak precedence"; else cout<<"Grammar is not weak precedence";