Пета задача

Краен срок
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)'