Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/19: Рейтинг темы: голосов - 19, средняя оценка - 5.00
 Аватар для danek130995
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137

Написать распознаватели для лексем

13.10.2015, 18:04. Показов 4414. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написать следующие распознаватели
1) Слово end
2) Идентификатор
3) Число

Чтобы выдать значение лексемы, нужно воспользоваться оператором <@, с помощью этого оператора можно собрать результат трансляции.

В качестве результата будет значение типа token

Haskell
1
data Token = End | Id String | Num float
Преподаватель на лекции дал вот эти функции:






У меня вопрос на счет функции maybe и just.
Я знаю, как определяется функция maybe:
Haskell
1
2
3
f::Int -> Maybe Int
 f 0 = Nothing
 f x = Just x
Т.е. если пришел не 0, вернет нам это число, иначе ничего не вернет.
В фотографиях лекций есть, например, функция epsilon:
Haskell
1
2
3
4
epsilon :: Parser ()
epsilon xs = Just ((), xs)
type Parser a =
       String -> maybe (a, String)
Как мы узнаем, как определена и работает функция maybe(a, String) для этого случая и как работает Just для некоего кортежа ((), xs)?
Помогите пожалуйста разобраться
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.10.2015, 18:04
Ответы с готовыми решениями:

Написать анализатор кода, определяющий тип лексем
Допустим есть строка и мне нужно её поделить на точки, запятые, else и так далее, как это сделать на c++ Добавлено через 1 минуту if...

Разработать сканер для выделения лексем из строки текста
Ребят, привет!!! :)Помогите мне пожалуйста... Срочно нужна ваша помощь.:wall: Мне нужно разработать программу – сканер для выделения...

Выделение лексем
Написать программу, использующую механизм управления при помощи таблиц (управление осуществляется данными!). Нужно выделить следующие...

36
Модератор
 Аватар для Curry
5171 / 3537 / 536
Регистрация: 01.06.2013
Сообщений: 7,700
Записей в блоге: 9
24.10.2015, 23:50
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от danek130995 Посмотреть сообщение
я не понял, как в cons попадает xs и что это в данном случае будет?
В функцию f, в (<@), в данном случае (строки 55 или 57), передаётся пара (Char,String) создаваемая в (<*>).
Для строки 57, к примеру, f - это (Id . cons).
ys - это остаток строки, ещё не разобранный, он в (Id . cons) и не передаётся.
1
 Аватар для danek130995
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
27.10.2015, 16:23  [ТС]
KolodeznyDiver
В <@ , когда мы вызываем f, ее аргументами будут y и ys(остаток строки)? Просто в cons же на вход идет кортеж(x, xs). Значит, при вызове f мы должны передать кортеж, что и делаем так:f y, ys? Так можно передавать кортеж и скобки не нужны? Или я где-то ошибся?
А зачем вы используете слово read(55), а также слово const(59)?
0
Модератор
 Аватар для Curry
5171 / 3537 / 536
Регистрация: 01.06.2013
Сообщений: 7,700
Записей в блоге: 9
27.10.2015, 17:31
Лучший ответ Сообщение было отмечено danek130995 как решение

Решение

Цитата Сообщение от danek130995 Посмотреть сообщение
В <@ , когда мы вызываем f, ее аргументами будут y и ys(остаток строки)?
Нет. В строке
Haskell
1
num = digit <*> many digit  <@ (Num . read . cons)
передаётся символ распарсенный по digit и строка распарсенная по many digit.
В
Haskell
1
ide = letter <*> many (letter <|> digit) <@ (Id . cons)
то же самое, только letter.
Haskell
1
endWord = symbol 'e' <*> symbol 'n' <*> symbol 'd' <@ (const End)
а тут передаётся кортеж в ещё одном кортеже. В кортежах буквы, но их значения не нужны, т.к. у конструктора End нет параметра, кортеж в кортеже игнорируются с помощью ф-ии const.
Цитата Сообщение от danek130995 Посмотреть сообщение
А зачем вы используете слово read
это функция преобразует из строки, в данном случае, в целое, которое передаётся конструктору Num.
Цитата Сообщение от danek130995 Посмотреть сообщение
а также слово const(59)?
(const End) тоже, что (\_ -> End).
1
 Аватар для danek130995
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
27.10.2015, 19:48  [ТС]
1)KolodeznyDiver, я это все понимаю, я наверное не так задал вопрос..
Я имел ввиду вот что. В этой строке:
Haskell
1
ide = letter <*> many (letter <|> digit) <@ (Id . cons)
левый аргумент <@-это
Haskell
1
 letter <*> many (letter <|> digit)
Правый аргумент - это
Haskell
1
 (Id . cons)
Смотрим на реализацию <@:
Haskell
1
2
3
4
infixr 5 <@ 
(p <@ f) xs = case p xs of                  
                    Nothing -> Nothing
                    Just(y,ys) -> Just (f y,ys)
Видим, что левый аргумент - это p, правый -это f.
Т.е., если функция p-
Haskell
1
 letter <*> many (letter <|> digit)
что-то вернет, вызываем Just(f y, ys), где вызываем функцию f -
Haskell
1
 (Id . cons)
от аргумента y, который в данном случае является символом, распарсенным по digit и строкой распарсенной по many digit, грубо говоря, y - это распознанный идентификатор, а точнее-это кортеж, если я не ошибаюсь, который состоит из распознанных символов, и строки, которая еще не распознана. Это я сужу по тому, что возвращает функция <*>: Just((y,z),zs). Так вот, получается вызываем функцию в итоге cons от y, но если посмотреть на ее реализацию, то видим:
Haskell
1
cons (x,xs) = x:xs
Т.е. видим, что на вход она требует кортеж, который поступает в качестве y. И она начинает сцеплять распознанные символы с xs(нераспознанными?). Где ошибка в моих рассуждениях?
2) А что такое
Haskell
1
\_ -> End
Что это за символ \_?
P.S.KolodeznyDiver, программу защитил сегодня благодаря Вам(спасибо Вам огромное!), на этом наш курс Хаскель закончился.. Это была последняя лабораторная.
0
Модератор
 Аватар для Curry
5171 / 3537 / 536
Регистрация: 01.06.2013
Сообщений: 7,700
Записей в блоге: 9
27.10.2015, 20:03
Лучший ответ Сообщение было отмечено danek130995 как решение

Решение

Цитата Сообщение от danek130995 Посмотреть сообщение
y - это распознанный идентификатор, а точнее-это кортеж, если я не ошибаюсь, который состоит из распознанных символов, и строки, которая еще не распознана.
Тут ошибка. Если, допустим, распознан идентификатор "abc", то y, это ('a',"bc").
Цитата Сообщение от danek130995 Посмотреть сообщение
Что это за символ \_?
\ начало определения лямбда функции. У неё один аргумент, который не используется - _.
1
 Аватар для danek130995
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
27.10.2015, 23:38  [ТС]
KolodeznyDiver, фух.. Разобрался с аргументом y. Вот только про лямбда функции не слышал, не представляю, что это. Сейчас посмотрел вики, это вроде как анонимная функция, т.е. можно в любом месте кода объявить. По виду функции
Haskell
1
\_ -> End
могу предположить, что какой бы ей аргумент не пришел, она вернет End.
Тогда почему нельзя просто написать End?
KolodeznyDiver, P.S. Из какого Вы города? Просто интересно
0
Модератор
 Аватар для Curry
5171 / 3537 / 536
Регистрация: 01.06.2013
Сообщений: 7,700
Записей в блоге: 9
27.10.2015, 23:55

Не по теме:

Цитата Сообщение от danek130995 Посмотреть сообщение
Вот только про лямбда функции не слышал
Оригинально же Вам преподавали Haskell.

Цитата Сообщение от danek130995 Посмотреть сообщение
Тогда почему нельзя просто написать End?
Потому что требовалась функция с аргументом, а не просто выражение.

Не по теме:

Цитата Сообщение от danek130995 Посмотреть сообщение
Из какого Вы города?
Я придерживаюсь принципа, чем больше конспирации (анонимности), тем лучше.

1
 Аватар для danek130995
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
28.10.2015, 00:11  [ТС]
KolodeznyDiver, оригинально-очень метко описали
0
0 / 0 / 0
Регистрация: 30.10.2015
Сообщений: 1
30.10.2015, 10:30
danek130995, я бы советовал Вам разобраться самостоятельно, обратиться к литературе (возможно, англоязычной). Кроме того, можно обратиться к преподавателю. Иначе на хорошее окончание семестра можете не рассчитывать.
0
30.10.2015, 13:28

Не по теме:

Похоже, преподаватель узнал, как сдает лабы его группа. Но с другой стороны, теперь можно к нему обращаться прямо здесь :)

0
30.10.2015, 14:25

Не по теме:

Цитата Сообщение от _Ivana Посмотреть сообщение
....Но с другой стороны, теперь можно к нему обращаться прямо здесь
к закоренелому оопшнику, который про лямбды не рассказывает?... хм...

0
 Аватар для danek130995
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
04.11.2015, 21:30  [ТС]
pycture, _Ivana, APGord, преподаватель ни о чем не узнал, преподавание Хаскель оставляет желать лучшего у нас. Другого выбора нет, как только обращаться на форум.
APGord, я разобрался, с помощью KolodeznyDiver, а на окончание семестра это не влияет, так как у нас зачет, и вообще, я отличник уже 4 семестра.
0
19.11.2015, 23:44

Не по теме:

Цитата Сообщение от danek130995 Посмотреть сообщение
Другого выбора нет, как только обращаться на форум.
Ещё есть Денис Николаевич Москвин, который обучает Haskell-ю на просторах интернета качественно и совершенно бесплатно.

0
 Аватар для danek130995
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
20.11.2015, 08:24  [ТС]
XRuZzz, спасибо) да уже все, курс хаскеля окончен��
0
20.11.2015, 10:54

Не по теме:

Цитата Сообщение от danek130995 Посмотреть сообщение
XRuZzz, спасибо) да уже все, курс хаскеля окончен��
боюсь, что Haskell будет сильно полезен в любой профессии.

0
20.11.2015, 11:11

Не по теме:

XRuZzz,

Цитата Сообщение от XRuZzz Посмотреть сообщение
Haskell будет сильно полезен в любой профессии
Ну, не впадайте в фанатизм. Культ личности Haskell-а. Вот, всё такое. Мне тоже Haskell нравится. Но не уподобляйтесь некоторым лисперам, которые заявляли что всё что есть было и будет в программировании уже есть в лиспе, и ни один байт не переместится без воли лиспа. Всё это инструменты - не более.

0
20.11.2015, 11:24

Не по теме:

просто для студентов практическая польза изучаемых предметов обычно не очевидна.
Стоит заметить, что многие программисты приходят к функциональному программированию, через 5-7 лет работы на императивных языках. Поэтому результаты невнимательности к проходимому материалу могут быть печальны.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.11.2015, 11:24

Анализатор лексем
Здравствуйте. Помогите пожалуйста, написать анализатор лексем. Я не понимаю, как он работает в паскале, да и не хочу писать на нём....

Выделение лексем
Приветствую всех! Помогите разобраться с выделением лексем. Необходимо выделить служебное слово (это я сделал сам), а так же восьмеричное...

Порядок лексем
Привет:) Лексический транслятор работает на &quot;тройку&quot;. Вот она: Поле Входные данные - заносим код Паскаля. Поле Выходные данные...

Подсчет лексем
Добрый день! Подскажите пожалуйста, как правильно подсчитать лексемы? Задание: int n = 1; // 5 лексем printf(&quot;Введите...

Сравнение лексем
Подскажите, пожалуйста, как на Си написать функцию, которая выводит сколько раз каждое слово встречалось в строке (слова-наборы символов,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru