Помощь - Поиск - Пользователи - Календарь
Полная версия: синтаксический анализ оператора Паскаль
Форум «Всё о Паскале» > Разработка ПО, алгоритмы, общие вопросы > Алгоритмы
Дашустрик
Произвести синтаксический анализ оператора языка Паскаль WRITELN(согласно условию,оператор может иметь произвольное число пробелов между символами).Записать автоматную грамматику оператора:задать её характеристики, представить дерево синтаксического анализа. По ней построить КА,который будет выполнять роль синтаксического анализатора оператора:начертить его граф-схему и построить таблицу переходов.

Плиз,help!!!
Archon
Так тебе надо сделать синтаксический анализ оператора в полной его форме (со списком аргументов и так далее)? Или просто разбор лексемы "WRITELN"? А то я что-то путаюсь. С одной стороны на автоматных грамматиках реализуется обычно именно лексический анализ, с другой у тебя явно написано слово "синтаксический" =) Если это слово написано не по ошибке, то странно, что на вход дается стока: обычно, синтаксический анализ проводится после лексического и имеет дело с лексемами, а не с отдельными терминальными символами.
Дашустрик
Цитата(Archon @ 3.11.2008 18:51) *

Так тебе надо сделать синтаксический анализ оператора в полной его форме (со списком аргументов и так далее)? Или просто разбор лексемы "WRITELN"? А то я что-то путаюсь. С одной стороны на автоматных грамматиках реализуется обычно именно лексический анализ, с другой у тебя явно написано слово "синтаксический" =) Если это слово написано не по ошибке, то странно, что на вход дается стока: обычно, синтаксический анализ проводится после лексического и имеет дело с лексемами, а не с отдельными терминальными символами.

я сама не знаю,поэтому и обращаюсь,я не могу понять,что такое синтаксический анализ,и как его сделать согласно моему условию задачи
Archon
Синтаксический анализ - разбор выражения. Обычно синтаксический анализ делится на два уровня:
* Лексический анализ — входной поток символов разбивается на линейную последовательность лексем - «слов» языка (напр. целые числа, идентификаторы, строковые константы и т. д.). Реализуется на автоматных грамматиках (регулярных выражениях). Одно из популярных средств для создания лексических анализаторов - LEX.
* Грамматический анализ — из лексем выделяются «предложения» языка, согласно грамматическим правилам, и создаётся дерево разбора. Для этого используются контекстно-свободные грамматики: s-грамматики, q-грамматики, ll(x)-грамматики (автоматы с магазинной памятью)... Популярное средство создания синтаксических анализаторов - YACC.
Это то что я об этом знаю =) Может встретишь знакомые слова? Тогда можно будет определить, что тебе нужно.

Я почему вопрос задал в предыдущем посте... Если делать анализ в полной форме, то неясно что может быть аргументами оператора. В паскале - почти любое выражение. Делать разбор для общего случая? Не слишком ли сложно?
Дашустрик
я так думаю,что для общего
Archon
Все таки сложно поверить, что полную версию записи оператора WriteLn требуется представить в виде автоматной грамматики. Это возможно, но сложно. Рекомендую перепроверить задание и посмотреть примеры выполнения, которые вы наверняка разбирали на лекциях.

Вот я попытался набросать автоматную грамматику упрощённого оператора WriteLn с поддержкой вывода строковых констант и целых числовых в десятичной форме. Без модификаторов вывода вроде "WriteLn(15:3);". Без арифметических выражений. Для удобства восприятия я исключил из терминальных символов заглавные буквы и использовал их для обозначения нетерминальных символов. Комментарии указаны в С++ стиле (//).

Код
S->writeln(A
A->);
A->'B    // начало строки
B->aB
B->bB
B->cB
...      // Перечисляем все буквы
B->zB
B->!B    // Пошли символы
B->''B   // Одинарная кавычка только в экранированном варианте (2 раза подряд)
...      // Все остальные символы
B->',C   // Конец строки с пробелами после запятой
B->',E   // Без пробелов
C->_C    // Под подчёркиванием я имел ввиду пробел
C->_E
A->0D    // Начало числа
A->1D
...      // Все остальные цифры
A->9D
A->-D    // Для отрицательного числа
A->+D    // Можно указывать и +
D->0D
D->1D
...      // Все остальные цифры
D->9D
D->,C    // Конец числа с пробелами
D->,E    // Конец числа без пробелов после запятой
E->'B    // E аналогично A, но не может заканчивать оператор (нет правила E->);)
E->0D
E->1D
...
E->9D
E->-D
E->+D
Надеюсь я нигде не ошибся.

Сильно упрощённый вариант записи оператора и уже такие сложности в грамматике... Устраивает такой вариант?
Дашустрик
мож скинуть ещё материальчика по этой теме,если таковой в наличии имеется
Archon
Честно говоря только мой конспект и Википедия. Ищи по запросу "формальная грамматика" или "синтаксический анализ"
Дашустрик
а мож скинуть конспект?? angel.gif blush.gif
Archon
Только если бандеролью, но мне он нужен =)
Дашустрик
а по почте никак?
Archon
Конспекты я пишу в тетрадях и они мне нужны. Да и немного там по этой теме полезного. Для тебя это не выход. Если возникнут конкретные вопросы - задавай сюда я постараюсь ответить. И не ленись пользоваться поиском. Google по запросу "методы трансляции" выдал интересные ссылки на первой же странице. В том числе и конспекты лекций.
Дашустрик
а отсканить и по e-mail отправить?
Дашустрик
только,единственный вопрос,числа предусмотрены,а переменные?
Дашустрик
вот моё решение
Код
S->writelnB
B->(C
C->пробелC
C->'D
D->любой_симв._кроме_апострофаD
D->''D
D->'E
E->пробелE
E->,C
C->лат.букваJ
C->_J
J->лат.букваJ
J->_J
J->цифраJ
J->,C
J->пробелK
K->пробелK
K->,C
J->)T
K->)T
T->пробелT
T->;U
Archon
Цитата
только,единственный вопрос,числа предусмотрены,а переменные?
У меня только числа и строки, переменные - нет.

В твоем варианте все на первый взгляд нормально, только есть пара замечаний:
1. Поддерживаются только строки и переменные, а простые числа - нет
2. Не поддерживаются следующие варианты записи оператора WriteLn (а по логике должны бы):
  • writeln();
  • writeln('text');
  • writeln(my_var, 'text');
То есть после текста не может идти закрывающей скобки и нет варианта пустой записи оператора
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.