Пета задача
- Краен срок
- 12.05.2011 17:00
Срокът за предаване на решения е отминал
(списък с редакциите от публикуването до момента - тук)
Лисп е език за програмиране от края на 50'те / началото на 60'те години. Има минималистичен синтаксис и е повлиял много съвременни езици. Освен това има много разновидности и диалекти. Сред тях са Common Lisp, Scheme, Logo, Emacs Lisp и др.
Преди последната версия на Scheme идентификаторите бяха case insensitive; в последната версия са case sensitive. Напишете функциите tokenize
, identifiers
, case_sensitive
; целта на функциите е частично да парснат описаното по-надолу подмножество на Scheme и да решат проблема, който преминаването към case sensitive синтаксис създава.
Описание на подмножеството на Scheme:
- Идентификаторите са низове съставени от букви, цифри и специални символи, като започват с буква.
- Специалните символи са: ! $ % & * + - . / : < = > ? @ ^ _ ~
- В допълнение, всеки самостоятелен специален символ също е идентификатор.
Токен (token) наричаме някое от следните неща:
- идентификатори
- последователности от символи оградени с двойни кавички
- числа (последователности от цифри, като те могат да съдържат най-много една точка)
- Следните:
(
,)
,'
,#t
,#f
tokenize
Да се напише функция tokenize(code)
, където code
е низ, представляващ програма на Scheme. Функцията трябва да връща списък от низове, които съответстват на токените в кода.
>>> code = '(foo (+ some-number SOME-NUMBER Some-Number) 123 #t "Miles Davis")'
>>> tokens = tokenize(code)
>>> print(tokens)
['(', 'foo', '(', '+', 'some-number', 'SOME-NUMBER', 'Some-Number', ')', '123', '#t', '"Miles Davis"', ')']
identifiers
Да се напише функция identifiers(tokens)
, която приема списък от низове tokens
и връща множеството от идентификаторите измежду токените. В случай на идентификатори със съвпадащи имена (case insensitive), в резултата трябва да присъства само първото срещане на идентификатора.
>>> tokens = ['(', '+', 'some-number', 'SOME-NUMBER', 'Some-Number', ')']
>>> print(identifiers(tokens))
{'+', 'some-number'}
case_sensitive
Да се напише функция case_sensitive(code, identifiers)
, която по низ code
, съдържащ код на Scheme и множество от низове, описващо идентификатори - identifiers
, връща нов низ, съдържащ код. Върнатият код представлява низа code
, като малките/големите букви в идентификаторите са заместени така че да съвпадат със съответните им от identifiers
.
Ако даден идентификатор се среща в в code
, но не се среща в identifiers
, го оставете непроменен.
>>> code = '(+ some-number SOME-NUMBER Some-Number)'
>>> identifiers = {'some-number'}
>>> case_sensitive_code = case_sensitive(code, identifiers)
>>> print(case_sensitive_code)
'(+ some-number some-number some-number)'