> 1 <

Автор Сообщение

Kirill

Members


Статус

1 сообщений

Где: ---
Род занятий:
Возраст:

#7632   2015-05-07 18:28 GMT+3 часа(ов)      
Есть грамматика некоторого языка

функция ::= имя_функции "(" список_параметров ")" "=>" "{" выражение "}"
список_параметров ::= параметр | параметр "," список_параметров
выражение ::= терм | условный_оператор
условный_оператор ::= условие "?" выражение ":" выражение
условие ::= терм ( "<" | "=" | ">" ) терм
терм ::= параметр | целое_число

Имя функции и название параметра состоят из латинских символов.
Обратите внимание, что количество параметров функции и глубина вложения условных операторов не ограничены.

На языке, который описывается данной грамматикой, можно определять различные функции.

Ваша задача состоит в том, что бы написать на языке Лисп программу, преобразующую определение одной из таких функций (заранее неизвестно, какой) в определение эквивалентной функции на языке Лисп.
Результирующая функция для каждого набора аргументов должна выдавать тот же результат, что и исходная функция - в этом смысл эквивалентности.

Например, для исходной функции f( x ) => {10} определение эквивалентной функции будем таким: (defun f (x) 10) .

Определение исходной функции будет передано в виде списка, для вышеприведённого примера такого: ( f \( x \) => { 10 } ) . Каждая лексема будет представлять отдельный элемент списка, так что лексическим анализом заниматься не нужно.

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

Примеры входных и выходных данных

>>> (tt '( func \( x \, y \) => { x > y ? -1 \: 1 } ) ) ; "func(x, y) => { x>y ? -1 : 1 }"
( defun func ( x y ) ( if ( > x y ) -1 1 ) )

>>> ( tt '( max \( x \, y \, z \) => { x > y ? x > z ? x \: z \: y > z ? y \: z } ) ); "max( x, y, z ) => { x > y ? x > z ? x : z : y > z ? y : z }"
( defun max (x y z) ( if (> x y) (if ( > x z ) x z) ( if (> y z) y z) ))

Помогите пожалуйста если не сложно!

Анастасия

Members


Статус

2 сообщений

Где: Russia
Род занятий:
Возраст:

#7642   2015-05-29 19:11 GMT+3 часа(ов)      
Добрый вечер,помогите пожалуйста найти ошибку, пишет есть лишняя скобка на входе.
(defun C:OFF2 (/ d obj ent adoc *error* undo lays Flag)
(defun *error* (msg)(vla-EndUndoMark adoc))
(vl-load-com)(setq adoc (vla-get-activedocument (vlax-get-acad-object))
lays (vla-get-layers adoc))(vla-StartUndoMark adoc)(setvar "CMDECHO" 0)
(if (null *OFF2*)(setq *OFF2* (abs (getvar "OFFSETDIST"))))
(if (zerop *OFF2*)(setq *OFF2* 1))(setq d (getvar "UNDOCTL"))
(cond (= d 0) (vl-cmdf "_.UNDO" "_All"))
((= d 3) (vl-cmdf "_.UNDO" "_Control" "_All"))
(t nil)) ;_ end of cond
(princ "\n Величина смещения <")(princ *OFF2*)(princ ">: ")
(initget 6)(if (null (setq d (getdist))) (setq d *OFF2*))
(setq *OFF2* d undo 0 Flag t)
(initget "Undo Отмени Г J Exit Выход У D _Undo Undo Undo Undo Exit Exit Exit Exit")
(while Flag
(setq obj (entsel (strcat "\n Выберите объект ["
(if (not (zerop undo)) "Отмени/" "")
"Выход] <выход>: ")))
(cond ((= obj "Undo")(if (not (zerop undo))(progn
(vl-cmdf "_UNDO" "_B")(setq undo (1- undo)))(alert "Нечего больше отменять")))
((= obj "Exit")(setq Flag nil))
((null obj)(if (= (getvar "ERRNO") 52)(setq Flag nil)(princ " *** Мимо ***")))
(t (setq ent (vlax-ename->vla-object (car obj)))
(cond ((= (vla-get-lock (vla-item lays (vla-get-layer ent))) :vlax-true)
(alert "На блокированном слое!"))
((vlax-method-applicable-p ent 'Offset)(vl-cmdf "_UNDO" "_M")(setq undo (1+ undo))
(vla-offset ent d)(vla-offset ent (- 0 d)))
(t (alert "Не удается создать объект, подобный данному")))))
(initget "Undo Отмени Г J Exit Выход У D _Undo Undo Undo Undo Exit Exit Exit Exit"))
(vla-EndUndoMark adoc)(princ))
(princ "\nНаберите в командной строке OFF2"))
> 1 <


Онлайн :

0 пользователь(ей), 25 гость(ей) :




Реклама на сайте: