Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2015, 19:04   #1
diamondmersik
 
Регистрация: 13.12.2015
Сообщений: 6
По умолчанию лексический анализатор

Программное средство "Лексический анализатор"

Написать программу, которая на основе текста программы на языке Pascal восстанавливает раздел объявлений программы. Текст программы без процедур и функций. Использовать стандартные типы данных, (к стандартным относятся: целые, вещественные, литерные, булевые)

Программа должна обладать удобным интерфейсом, эффективно использовать память и обладать по возможности большей скоростью работы. Для реализации поставленной задачи использовать динамические структуры данных.

Входные данные:
Файл с текстом программы на языке Pascal.
Выходные данные:
Файл с текстом программы на языке Pascal.

НЕ могу понять как программа должна восстановить раздел var? прочитать файл и найти зарезервированные слова еще более мене понимаю а дальше все конец..
diamondmersik вне форума Ответить с цитированием
Старый 13.12.2015, 19:17   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Код:
НЕ могу понять как программа должна восстановить раздел var? прочитать файл и найти зарезервированные слова еще более мене понимаю а дальше все конец.
Лексический анализ разбирает входной текст на слова и пробельные символы.
Ваша задача построить очередь или массив лексем.
А после по этой очереди восстановить раздел объявлений программы. Т.е. вывести всё что между словами 'program' и 'begin'.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 13.12.2015, 20:07   #3
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

А я совершенно по другому понял задание..
Мол s := '123'; I := 4; r:=17.32;
И типы нужно самому проставить
Poma][a вне форума Ответить с цитированием
Старый 13.12.2015, 20:22   #4
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

А как среди текста определиться какого типа переменная?
"b := 2/43;
a := int(sqrt(64)+sin(b));"
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 13.12.2015, 20:33   #5
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Перевозе очевидно. Второе тоже
В первом все просто - деление не целочисленное
Во втором есть преобразование
Poma][a вне форума Ответить с цитированием
Старый 13.12.2015, 20:36   #6
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
А как среди текста определиться какого типа переменная?
Да просто вроде . Секция var идет раньше объявления переменных - по ней можно построить таблицу переменных, с информацией о типах. Поэтому когда Вам встретится переменная, просто ищете информацию о ней в такой таблице. Если информации нет - это ошибка - переменная должна быть объявлена перед непосредственным использованием.
Цитата:
Во втором есть преобразование
Второе это просто результат функции, там вообще все очевидно.
Про первое есть такое понятие как инфекционность (инвазийность) типов. Рассматривается в функциональном программировании. Вкратце - язык составляет некоторые правила по которым результаты операции наследуют типы. В частности вещественные типы инфекционные, а целые нет. Это значит что если в выражении используется вещественные числа, то результат также будет вещественен, независимо от того будут ли там целые числа или нет. Для императивных языков не очевидно, но функциональных языках классов чисел больше - там и длинные целые и комплексные и дроби и т.д. Поэтому такие вопросы освещаются очень подробно. В частности есть в описании стандарта Scheme.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 13.12.2015 в 20:42.
Utkin вне форума Ответить с цитированием
Старый 13.12.2015, 20:41   #7
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Не. Не помню про int отвечу за integer это именно преобразование. Помню пан Стилет ещё дискутировал
Poma][a вне форума Ответить с цитированием
Старый 13.12.2015, 20:45   #8
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Не помню про int отвечу за integer это именно преобразование.
Разницы особой нет. Но еще нужно отличать реализацию и модель языка. Я бы реализовывал именно как функцию, так как поведение идентично. Назвать в концепции можно по-разному, но есть такая вещь как бритва Оккама, которая не советует плодить лишние сущности. И если в концепции языка программирования важно для понимания вводить какие-то вещи, то с точки зрения реализации пофиг.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 13.12.2015, 21:35   #9
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

такой подход, без динамики, может помочь в решении задания?
1. ищем :=, все что слева - идентификатор
2а. если в правой секции находим " - тип идентификатора - String;
2б. если в правой секции находим слово из зарезервированых - тип идентификатора - Real;
2c..я. не реализированы

Код:
Program HelloWorld(output);
const reservWord : array [1..10] of string = ('sin','cos','sqr','arctan','exp','ln','/','','','');
var varSection,s:string; 

function Find(s:string):string;
var line,sright :string; identifier:string; hasBlank:boolean;i,j:byte;
begin
  identifier := '';hasBlank:=false;
  j:= pos(':=',s);sright:=copy(s,j+1,length(s));
  for i:=1 to j-1 do
   if s<>' ' then identifier := identifier + s[i];
  line := identifier + ': ';
  for i:=j+1 to length(sRight) do
  if pos('"',sRight) <> 0 then
   begin line:=line + 'String;'; hasBlank:=true; break end;
  if not(hasBlank) then
   for i:=low(reservWord) to high(reservWord) do
    if pos(reservWord[i],sRight) <>0 then begin line:=line + 'Real;'; break end;
    Find:=line
 end;
 BEGIN
 varSection := 'var ';
  s := 'b := 2/43;';
  varSection:='var '+find('b := 2/43;')+find('a := int(sqrt(64)+sin(b))');
   writeln(varSection);
end.
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.

Последний раз редактировалось Aleksandr H.; 13.12.2015 в 21:38.
Aleksandr H. вне форума Ответить с цитированием
Старый 13.12.2015, 22:03   #10
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Код:
j:= pos(':=',s);sright:=copy(s,j+1,length(s));
  for i:=1 to j-1 do
   if s<>' ' then identifier := identifier + s[i];
Какой-то очень хитрый супер код. Следуя логике данного фрагмента:
if x:=5 будет преобразован в ifx, хотя тут явная ошибка в самих данных. Я не пойму кто Вам дал право исключать пробелы? Если в идентификаторе есть пробел это явный косяк. И потому анализ имени идентификатора должная быть отдельная процедура. Ну и также представим на секунду что юзер опечатался и ввел :=5, то есть не указал идентификатор. Результатом по логике должен быть ахтунг, но прога просто пройдет дальше. Я Вас правильно понял?
Я бы поступил так:
1. Получил строку и отриммил ее (удалил пробелы по краям)
2. Проверил, что строка содержит :=
3. Взял левую часть строки и проверил бы идентификатор (нельзя начинать с цифры, содержать пробелы и т.д.)
4. Взял правую часть строки.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 13.12.2015 в 22:08.
Utkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Лексический анализатор 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