Построение формального языка L
Дисциплина: ПрограммированиеТип работы: Курсовая
Тема: Построение формального языка L
Построение формального языка
WHILE
AB )
WHILE -
входной терминальный символ
- условное выражение
- некоторая функция, которая может отсутствовать
параметры функции, которые тоже могут отсутствовать
Пример правильного синтаксиса:
WHILE(A
Ab=56+67 -
условное выражение
clrscr()
- функция, без параметров
Подбор грамматики
G[Z]
по языку
Любая грамматика, к примеру
G[Z]
содержит следующие базисные элементы
t, V
n, Z, P
где:
словарь терминальных символов
словарь нетерминальных символов
начальный нетерминальный символ
множество правил вывода
оператор
Оператор
while
Функция
!= T
O | T*O | T**O | T+O | T-O | T/O
ЦБЗ
ЦБЗ
Функция
ЦБЗ
Классификация
G[Z]
оператор
Оператор
while
Функция
!= T
O | T*O | T**O | T+O | T-O | T/O
ЦБЗ
ЦБЗ
Функция
ЦБЗ
Сделаем замену
нетерминальных символов:
Оператор
Функция
ЦБЗ
Сделаем замену
терминальных символов:
WHILE
G[Z]
abAc[D]d
B|A= B |A != B
C | B*C | B**C | B+C | B-C | B/C
bAc | E | F
g{g|f}
f{f}
Eb[G{hG}]c
E | F |
Вывод :
G[Z] -
контекстно-свободная грамматика.
Выбор метода анализа
Хотя однозначность в общем случае для контекстно-зависимых грамматик не доказана, ее использование возможно для грамматик в которых однозначность очевидна. Наиболее хорошо
разработанным методом анализа, для данного типа грамматик является, метод рекурсивного спуска.
Диагностика и нейтрализация ошибок
Разработанный алгоритм относится к общеизвестному методу синтаксического разбора, предложенный Айронсом.
Основная идея метода состоит в том, что по контексту без возврата отбрасываются те символы, которые привели в тупиковую ситуацию и разбор продолжается.
Приведем пример синтаксического разбора:
While (A
abAc[D]d
B|A= B |A != B
C | B*C | B**C | B+C | B-C | B/C
bAc | E | F
g{g|f}
f{f}
Eb[G{hG}]c
E | F |
g{g} b
While (
тупиковая ситуация
Тестирование на цепочках
Протокол работы синтаксического распознавателя оператора цикла
while
языка С.
_____________________________________________________________________
Обрабатываем строчку - While(a
Найден While проверка началась с символа - (
Проверка на AB
Проверка на TERM
Проверка на O
Проверка на IDENT, текущий символ - a
Проверка на AB
Проверка на TERM
Проверка на O
Проверка на IDENT, текущий символ - )
Проверка на ЦБЗ,
текущий символ - )
Проверка на FUNC,
текущий символ - c
Проверка на IDENT, текущий символ - c
Предупреждение: Отсутствует условие ()
Не найден идентификатор или ЦБЗ
_____________________________________________________________________
Обрабатываем строчку - while(1
Найден While проверка началась с символа - (
Проверка на AB
Проверка на TERM
Проверка на O
Проверка на IDENT, текущий символ - 1
Проверка на ЦБЗ,
текущий символ - 1
Проверка на AB
Проверка на TERM
Проверка на O
Проверка на AB
Проверка на TERM
Проверка на O
Проверка на IDENT, текущий символ - 3
Проверка на ЦБЗ,
текущий символ - 3
Проверка на TERM
Проверка на O
Проверка на AB
Проверка на TERM
Проверка на O
Проверка на IDENT, текущий символ - 4
Проверка на ЦБЗ,
текущий символ - 4
Проверка на TERM
Проверка на O
Проверка на IDENT, текущий символ - 5
Проверка на ЦБЗ,
текущий символ - 5
Проверка на TERM
Проверка на O
Проверка на AB
Проверка на TERM
Проверка на O
Проверка на IDENT, текущий символ - 3
Проверка на ЦБЗ,
текущий символ - 3
Проверка на TERM
Проверка на O
Проверка на IDENT, текущий символ - 4
Проверка на ЦБЗ,
текущий символ - 4
Проверка на TERM
Проверка на O
Проверка на AB
Проверка на TERM
Проверка на O
Проверка на IDENT, текущий символ - 4
Проверка на ЦБЗ,
текущий символ - 4
Проверка на AB
Проверка на TERM
Проверка на O
Проверка на IDENT, текущий символ - 4
Проверка на ЦБЗ,
текущий символ - 4
Проверка на FUNC,
Проверка на IDENT, текущий символ - ;
Отсутствует )
Предупреждение: отсутствует имя функции
_____________________________________________________________________
Обрабатываем строчку - 435 4 whilei3t*(ewqw++()*we) rscr(456,345,rtgrt,345444rtr,,,)
Найден While проверка началась с символа - i
Проверка на AB
Проверка на TERM
Проверка на O
Проверка на IDENT, текущий символ - i
Проверка на AB
Проверка на TERM
Проверка на O
Проверка на IDENT, текущий символ - 3
Проверка на ЦБЗ,
текущий символ - 3
Проверка на TERM
Проверка на O
Проверка на AB
Проверка на TERM
Проверка на O
Проверка на IDENT, текущий символ - e
Проверка на TERM
Проверка на O
Проверка на IDENT, текущий символ - +
Проверка на ЦБЗ,
текущий символ - +
Проверка на TERM
Проверка на O
Проверка на TERM
Проверка на O
Проверка на IDENT, текущий символ - w
Проверка на FUNC,
текущий символ - r
Проверка на IDENT, текущий символ - r
Проверка на PAR,
текущий символ - 4
Проверка на IDENT, текущий символ - 4
Проверка на ЦБЗ,
текущий символ - 4
Проверка на PAR,
текущий символ - 3
Проверка на IDENT, текущий символ - 3
Проверка на ЦБЗ,
текущий символ - 3
Проверка на PAR,
текущий символ - r
Проверка на IDENT, текущий символ - r
Проверка на PAR,
текущий символ - 3
Проверка на IDENT, текущий символ - 3
Проверка на ЦБЗ,
текущий символ - 3
Проверка на PAR,
текущий символ - ,
Проверка на IDENT, текущий символ - ,
Проверка на ЦБЗ,
текущий символ - ,
3t*(ewqw++()*we) rscr(456,345,rtgrt,345444rtr,,,)
Отсутствует (
Отсутствует )
Предупреждение: Отсутствует условие ()
после функции
Параметр функции не может начинатся с цифры
Неизвестный идентификатор(ы) -
435, 4,
Не найден идентификатор или ЦБЗ
Идентификатор не может начинаться с цифры
Не найден или не верный параметр
Неизвестная знаковая конструкция
_____________________________________________________________________
Обрабатываем строчку - whiLE(43-(sss233)fewfew) sd(we)
Найден While проверка началась с символа - (
Проверка на AB
Проверка на TERM
Проверка на O
Проверка на IDENT, текущий символ - 4
Проверка на ЦБЗ,
текущий символ - 4
Проверка на TERM
Проверка на O
Проверка на AB
Проверка на TERM
Проверка на O
Проверка на IDENT, текущий символ - s
Проверка на AB
Проверка на TERM
Проверка на O
Проверка на IDENT, текущий символ - 2
Проверка на ЦБЗ,
текущий символ - 2
Проверка на AB
Проверка на TERM
Проверка на O
Проверка на IDENT, текущий символ - f
Проверка на FUNC,
текущий символ -
Проверка на IDENT, текущий символ - s
Проверка на PAR,
текущий символ - w
Проверка на IDENT, текущий символ - w
233)fewfew) sd(we)
после функции
Пропущено / или * или ** или + или -
_____________________________________________________________________
Обрабатываем строчку - while(i23*232) clrscr(,)
Найден While проверка началась с символа - (
Проверка на AB
Проверка на TERM
Проверка на O
Проверка на IDENT, текущий символ - i
Проверка на AB
Проверка на TERM
Проверка на O
Проверка на IDENT, текущий символ - 3
Проверка на ЦБЗ,
текущий символ - 3
Проверка на AB
Проверка на TERM
Проверка на O
Проверка на AB
Проверка на TERM
Проверка на O
Проверка на IDENT, текущий символ - 5
Проверка на ЦБЗ,
текущий символ...