Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Может кому интересно будет. Common Lisp парсинг языка. / 9 сообщений из 9, страница 1 из 1
07.10.2009, 19:45:31
    #36238398
AlexGru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Может кому интересно будет. Common Lisp парсинг языка.
Я конечно сам разберусь. Интересно ведь очень, но...
может кому тоже интересно.

Есть такие функции:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
(defun mainf(str)
  (if (not (search "begin" str))
          (if (not (search "end;" str))
            nil
            (cons (part-to-end str) (mainf (subs-end str)))
          )
         ;--------------------------------------------
         (if (next-begin str) 
           (if (> (length (part-to-begin str))  0 )
             (list (part-to-begin str) (list :begin (mainf (subs-begin str))))
             (list :begin (mainf (subs-begin str)))
           )
           (list (part-to-end str))
         )
         ;--------------------------------------------
  )
)

(defun subs-begin(str)
  (subseq str (+ (search "begin" str)  5 ) (length str)))

(defun subs-end(str)
  (subseq str (+ (search "end;" str)  4 ) (length str))) 

(defun next-begin(str)
 (let ((b nil)
       (e nil))
  (setf b (search "begin" str))
  (setf e (search "end" str))
  (if (eq b nil)
      (setf b - 1 ))
  (if (eq e nil)
      (setf e - 1 ))
  (if (> e b)
   t
   nil)))

(defun part-to-begin(str)
  (subseq str  0  (search "begin" str)))

(defun part-to-end(str)
  (subseq str  0  (search "end;" str)))

Так запускаю.
Код: plaintext
1.
(study:mainf "begin d1 begin d2 begin d3 end; d4 end; d5 end;")

Получаю
Код: plaintext
1.
(:BEGIN (" d1 " (:BEGIN (" d2 " (:BEGIN (" d3 " " d4 " " d5 "))))))

Но, хочу получить
Код: plaintext
1.
(:BEGIN (" d1 " (:BEGIN (" d2 " (:BEGIN (" d3 ") " d4 ") " d5 "))))
...
Рейтинг: 0 / 0
07.10.2009, 21:25:56
    #36238521
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Может кому интересно будет. Common Lisp парсинг языка.
AlexGru пишет:

> (defun mainf(str)
> (if (not (search "begin" str))
> (if (not (search "end;" str))
> nil
> (cons (part-to-end str) (mainf (subs-end str)))
> )
> ;--------------------------------------------
> (if (next-begin str)
> (if (> (length (part-to-begin str)) *0*)
> (list (part-to-begin str) (list :begin (mainf (subs-begin str))))
> (list :begin (mainf (subs-begin str)))
> )
> (list (part-to-end str))
> )
> ;--------------------------------------------

Научись CONS-ом пользоваться.
Ну нельзя ж так.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
07.10.2009, 21:26:10
    #36238522
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Может кому интересно будет. Common Lisp парсинг языка.
AlexGru пишет:

Если это не чисто академический интерес, то
предлагаю воспользоваться готовыми парсерами грамматик
типа CL-YACC. Их есть.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
07.10.2009, 22:33:33
    #36238568
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Может кому интересно будет. Common Lisp парсинг языка.
AlexGru пишет:

Пока у меня получилось вот это :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
(defun parse (text)
   ""
   (loop
      :for el = (read text nil nil)
      :while el
      :append (cond ((string-equal el :begin)
		     (list :begin (parse text)))
		    ((string-equal el :|END.|)
		     nil)
		    ((null el)
		     nil)
		    (t (list el)))))

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
08.10.2009, 01:02:52
    #36238685
NextMan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Может кому интересно будет. Common Lisp парсинг языка.
Эх, помнится, и мы писали интерпретатор Лиспа.
Вот только не помню, для чего...ИИ какой-то...
...
Рейтинг: 0 / 0
08.10.2009, 06:23:07
    #36238753
AlexGru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Может кому интересно будет. Common Lisp парсинг языка.
MasterZiv
AlexGru пишет:

Пока у меня получилось вот это :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
(defun parse (text)
   ""
   (loop
      :for el = (read text nil nil)
      :while el
      :append (cond ((string-equal el :begin)
		     (list :begin (parse text)))
		    ((string-equal el :|END.|)
		     nil)
		    ((null el)
		     nil)
		    (t (list el)))))


Код: plaintext
1.
CL-USER> (parse "begin d1 begin d2 end; begin d3 end; d5 end;")

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
There is no applicable method for the generic function
  #<STANDARD-GENERIC-FUNCTION STREAM-READ-CHAR ( 1 )>
when called with arguments
  ("begin d1 begin d2 end; begin d3 end; d5 end;").
   [Condition of type SIMPLE-ERROR]

Restarts:
  0 : [ABORT] Abort
  1 : [CLOSE-CONNECTION] Close SLIME connection
  2 : [ABORT] Exit debugger, returning to top level.

c
Код: plaintext
1.
 (parse "begin d1 begin d2 begin d3 end; d4 end; d5 end;")
так же.
...
Рейтинг: 0 / 0
08.10.2009, 06:30:03
    #36238754
AlexGru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Может кому интересно будет. Common Lisp парсинг языка.
MasterZiv
Если это не чисто академический интерес, то
предлагаю воспользоваться готовыми парсерами грамматик
типа CL-YACC. Их есть.


Пока это чисто академический интерес.
...
Рейтинг: 0 / 0
08.10.2009, 09:32:56
    #36238931
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Может кому интересно будет. Common Lisp парсинг языка.
AlexGru пишет:

> CL-USER> (parse "begin d1 begin d2 end; begin d3 end; d5 end;")
>
>
> There is no applicable method for the generic function

(parse
(make-string-input-stream "begin d1 begin d2 end; begin d3 end; d5 end;"))

Но только она не совсем то делает, что тебе нужно. (кстати, что делать
нужно, ты бы более формально изложил -- было бы неплохо).
Я его не добил до конца. Спать хотел.

Но как идея просто...


То, что ты написал -- это как-то сильно не по-лисповски.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
08.10.2009, 09:55:53
    #36238974
AlexGru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Может кому интересно будет. Common Lisp парсинг языка.
Вообще задача такая.

Есть много кода, исходников на языке PL/SQL.
Требуется
1) вначале распарсить по ключам BEGIN END;
в список.

Пр: (d1,d2,d3 что-то, пока не важное, селекты, лок. переменные м пр.)
Есть begin d0 begin d1 end; begin d2 end; d3 end;
После первой лини парсинга должны получить
(:begin ("d0" (:begin "d2") (:begin "d2") "d3"))
т.е.чтобы получился аналог дерева или AST(если прав в абревиатуре).

2) Распарсить блоки d1,d2,d3...
В части поиска операторов SQL и некоторых управл. структур языка.

3) Имея помимо исходников (текстовый файл на актуальное время) статистику по таблицам.
Разыскать неоптимальные операторы SQL, в рамках всех исходников.

Самый простой пример
1)
было:

SELECT A
FROM(SELECT A,B,C...
FROM T1,T2...
WHERE ....)

должно быть:

SELECT A
FROM(SELECT A
FROM T1,T2...
WHERE ....)
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Может кому интересно будет. Common Lisp парсинг языка. / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]