Для заданной КС-грамматики написать синтаксический анализатор, реализующий метод рекурсивного спуска без откатов. Результатом работы синтаксического анализатора должно быть левое порождение входной строки, представленное списком правил грамматики, использованных в процессе порождения. Использовать теорию контекстно-свободных грамматик. Устранение непосредственной левой рекурсии A->β1A'|β2A'|...|βmA' Алгоритм устранения левой рекурсии, которая не является непосредственной рекурсией (гарантированно работает с грамматикой, не имеющей циклов и ε-правил). Левая факторизация КСГ Во многих случаях устранение левой рекурсии и проведение левой факторизации позволяет получить грамматику, которая может быть проанализирована синтаксическим анализатором, работающим методом рекурсивного спуска без отката. Условие: Левая рекурсия отсутствует, проводим левую факторизацию: Функции, реализующие правила грамматики для каждой переменной грамматики и использующие сведения из множеств FIRST: void S() { T(); A(); } void T() { F(); B(); } void F() { switch(NextChar()) { case 'a': MoveToNext('a');break; case 'b': MoveToNext('b');break; default: ErrorMsg(); } } void A() { switch(NextChar()) { case '+': MoveToNext('+'); S(); break; case '-': MoveToNext('-'); S(); break; default: break; } } void B() { switch(NextChar()) { case '*': MoveToNext('*'); T(); break; default: break; } } Исходный код нисходящего синтаксического анализатора, реализующего заданную КСГ, находится в приложенном архиве.
Ключевые слова:
синтаксический анализатор, метод рекурсивного спуска без отката, контекстно-свободная грамматика, левая рекурсия, факторизация
|
|||||||