Skip to content

Commit

Permalink
Assignment №5
Browse files Browse the repository at this point in the history
  • Loading branch information
skanev committed May 5, 2011
1 parent cecb72e commit b8cf6bd
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 0 deletions.
46 changes: 46 additions & 0 deletions 2011/05/README.markdown
@@ -0,0 +1,46 @@
Лисп е език за програмиране от края на 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`

Да се напише функция `get_first_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)'

19 changes: 19 additions & 0 deletions 2011/05/sample_test.py
@@ -0,0 +1,19 @@
import unittest
from solution import *

class FifthHomeworkSimpleTests(unittest.TestCase):
def test_tokenize(self):
self.assertEqual(
['(', 'times', '3', '"spam"', ')'],
tokenize('(times 3 "spam")'))

def test_identifiers(self):
self.assertEqual(
{'sum', 'number'},
identifiers(['(', 'sum', '42', 'number', 'NUMBER', ')']))

def test_case_sensitive(self):
self.assertEqual('(spam "SPAM")', case_sensitive('(Spam "SPAM")', {'spam'}))

if __name__ == "__main__":
unittest.main()

0 comments on commit b8cf6bd

Please sign in to comment.