|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
13.12.2015, 19:04 | #1 |
Регистрация: 13.12.2015
Сообщений: 6
|
лексический анализатор
Программное средство "Лексический анализатор"
Написать программу, которая на основе текста программы на языке Pascal восстанавливает раздел объявлений программы. Текст программы без процедур и функций. Использовать стандартные типы данных, (к стандартным относятся: целые, вещественные, литерные, булевые) Программа должна обладать удобным интерфейсом, эффективно использовать память и обладать по возможности большей скоростью работы. Для реализации поставленной задачи использовать динамические структуры данных. Входные данные: Файл с текстом программы на языке Pascal. Выходные данные: Файл с текстом программы на языке Pascal. НЕ могу понять как программа должна восстановить раздел var? прочитать файл и найти зарезервированные слова еще более мене понимаю а дальше все конец.. |
13.12.2015, 19:17 | #2 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Код:
Ваша задача построить очередь или массив лексем. А после по этой очереди восстановить раздел объявлений программы. Т.е. вывести всё что между словами 'program' и 'begin'.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
13.12.2015, 20:07 | #3 |
Новичок
Джуниор
Регистрация: 11.10.2011
Сообщений: 3,882
|
А я совершенно по другому понял задание..
Мол s := '123'; I := 4; r:=17.32; И типы нужно самому проставить |
13.12.2015, 20:22 | #4 |
2 the Nation Glory
Старожил
Регистрация: 27.05.2014
Сообщений: 3,289
|
А как среди текста определиться какого типа переменная?
"b := 2/43; a := int(sqrt(64)+sin(b));"
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы. |
13.12.2015, 20:33 | #5 |
Новичок
Джуниор
Регистрация: 11.10.2011
Сообщений: 3,882
|
Перевозе очевидно. Второе тоже
В первом все просто - деление не целочисленное Во втором есть преобразование |
13.12.2015, 20:36 | #6 | ||
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Цитата:
Цитата:
Про первое есть такое понятие как инфекционность (инвазийность) типов. Рассматривается в функциональном программировании. Вкратце - язык составляет некоторые правила по которым результаты операции наследуют типы. В частности вещественные типы инфекционные, а целые нет. Это значит что если в выражении используется вещественные числа, то результат также будет вещественен, независимо от того будут ли там целые числа или нет. Для императивных языков не очевидно, но функциональных языках классов чисел больше - там и длинные целые и комплексные и дроби и т.д. Поэтому такие вопросы освещаются очень подробно. В частности есть в описании стандарта Scheme.
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика Последний раз редактировалось Utkin; 13.12.2015 в 20:42. |
||
13.12.2015, 20:41 | #7 |
Новичок
Джуниор
Регистрация: 11.10.2011
Сообщений: 3,882
|
Не. Не помню про int отвечу за integer это именно преобразование. Помню пан Стилет ещё дискутировал
|
13.12.2015, 20:45 | #8 | |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Цитата:
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
|
13.12.2015, 21:35 | #9 |
2 the Nation Glory
Старожил
Регистрация: 27.05.2014
Сообщений: 3,289
|
такой подход, без динамики, может помочь в решении задания?
1. ищем :=, все что слева - идентификатор 2а. если в правой секции находим " - тип идентификатора - String; 2б. если в правой секции находим слово из зарезервированых - тип идентификатора - Real; 2c..я. не реализированы Код:
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы. Последний раз редактировалось Aleksandr H.; 13.12.2015 в 21:38. |
13.12.2015, 22:03 | #10 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Код:
if x:=5 будет преобразован в ifx, хотя тут явная ошибка в самих данных. Я не пойму кто Вам дал право исключать пробелы? Если в идентификаторе есть пробел это явный косяк. И потому анализ имени идентификатора должная быть отдельная процедура. Ну и также представим на секунду что юзер опечатался и ввел :=5, то есть не указал идентификатор. Результатом по логике должен быть ахтунг, но прога просто пройдет дальше. Я Вас правильно понял? Я бы поступил так: 1. Получил строку и отриммил ее (удалил пробелы по краям) 2. Проверил, что строка содержит := 3. Взял левую часть строки и проверил бы идентификатор (нельзя начинать с цифры, содержать пробелы и т.д.) 4. Взял правую часть строки.
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика Последний раз редактировалось Utkin; 13.12.2015 в 22:08. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Лексический анализатор | ercin1991 | Общие вопросы C/C++ | 4 | 05.12.2011 16:34 |
Лексический анализатор, С++ | holy_0dmin | Фриланс | 4 | 03.12.2011 02:36 |
Лексический анализатор С++ | EniOk | Помощь студентам | 1 | 06.12.2009 15:43 |
Лексический анализатор | serguna005 | Паскаль, Turbo Pascal, PascalABC.NET | 5 | 06.12.2008 00:00 |