powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Может кому интересно будет. Common Lisp парсинг языка.
9 сообщений из 9, страница 1 из 1
Может кому интересно будет. Common Lisp парсинг языка.
    #36238398
AlexGru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я конечно сам разберусь. Интересно ведь очень, но...
может кому тоже интересно.

Есть такие функции:
Код: 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
Может кому интересно будет. Common Lisp парсинг языка.
    #36238521
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Может кому интересно будет. Common Lisp парсинг языка.
    #36238522
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexGru пишет:

Если это не чисто академический интерес, то
предлагаю воспользоваться готовыми парсерами грамматик
типа CL-YACC. Их есть.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Может кому интересно будет. Common Lisp парсинг языка.
    #36238568
Фотография 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)))))

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Может кому интересно будет. Common Lisp парсинг языка.
    #36238685
Фотография NextMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эх, помнится, и мы писали интерпретатор Лиспа.
Вот только не помню, для чего...ИИ какой-то...
...
Рейтинг: 0 / 0
Может кому интересно будет. Common Lisp парсинг языка.
    #36238753
AlexGru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Может кому интересно будет. Common Lisp парсинг языка.
    #36238754
AlexGru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Если это не чисто академический интерес, то
предлагаю воспользоваться готовыми парсерами грамматик
типа CL-YACC. Их есть.


Пока это чисто академический интерес.
...
Рейтинг: 0 / 0
Может кому интересно будет. Common Lisp парсинг языка.
    #36238931
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Может кому интересно будет. Common Lisp парсинг языка.
    #36238974
AlexGru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще задача такая.

Есть много кода, исходников на языке 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
9 сообщений из 9, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Может кому интересно будет. Common Lisp парсинг языка.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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