LINUX.ORG.RU

Хочу заняться анализом кода.

 ,


1

4

Интерфейсом будет эмакс, но т.к. я elisp-ом, во-первых, владею плохо и, во-вторых, я думаю эмакс уже умеет достаточно. Поэтому, я хочу отправлять содержимое буфера на внешний сервис по http и там проводить анализ, отвечая списками от какого место по какое чем надо раскрашивать. По этому поводу есть вопрос: какие функции emacs лучше для этого использовать?

Второе - какие посоветуйте материалы для элементарного структурного анализа кода на таких языках как C, Java, C#? ИМХО мне кажется, что достаточно знать язык, но на вики нехилые дозы какого-то матана

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 4)

какие функции emacs лучше для этого использовать?

https://www.gnu.org/software/emacs/manual/html_node/elisp/Buffer-Contents.html

http://www.gnu.org/software/emacs/manual/html_node/elisp/Network.html

какие посоветуйте материалы для элементарного структурного анализа кода на таких языках как C, Java, C#?

Анализируй AST как тебе надо. Или вопрос в том, как получить этот самый AST?

yoghurt ★★★★★
()

Лисп с емаксом конечно хорошо, но часто все начинания скатываются в регулярки. Ты ведь не хочешь этого?

ООП языки - это сплошная рефлексия.

anonymous
()
Ответ на: комментарий от ados

Если нужна теория, то кури формальные языки, грамматики - Хопкрофт, Ульман, например. Или можешь взять готовый парсер для твоего $LANGUAGE_NAME.

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

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

ados ★★★★★
() автор топика
Ответ на: комментарий от yoghurt

Понимаю, что гугл мог всё рассказать. Я просто думал есть что-то уровнем повыше - дополнений хоть отбавляй.

Всё равно спасибо.

ados ★★★★★
() автор топика

Для парсинга C/C++ в AST стоит юзать libclang. Код можно писать как минимум на C, C++ и Python.

В модуле irony-mode для emacs схема такая же: буфер и метаданные пакуются в JSON и отправляются внешней программе, написанной на C++, которая парсит код с помощью libclang и возвращает в emacs описание в виде s-exp.

gv
()
Ответ на: комментарий от gv

Для парсинга C/C++ в AST стоит юзать libclang.

А он умеет парсить код с макросами и инклудами, например? Или перед этим надо скормить код препроцессору?

anonymous
()
Ответ на: комментарий от anonymous

А он умеет парсить код с макросами и инклудами, например? Или перед этим надо скормить код препроцессору?

Отдельно вызывать препроцессор не надо. IIRC, в libclang есть минимум 2 api:

  • Получение AST. В этом случае информации о макросах не останется.
  • Последовательный обход файла, в процессе которого вызываются юзерские колбэки (см. clang_visitChildren). В этом случае можно повесить колбэки на директивы препроцессора и раскрытие макросов.
gv
()

нужна будет многопоточность https://github.com/kiwanami/emacs-deferred но раскрашиваться с этим хттп будет заторможенно, скорей всего. Закодировать, отправить, обработать, получить, раскодировать + оверхед от ненативной многопоточности ~50ms.

Парсеры тут http://en.wikipedia.org/wiki/Comparison_of_parser_generators

Если будешь свой писать, то самый простой — LL(1), но твои языки он не распарсит.

qweqwe
()
Ответ на: комментарий от ados

Решил так:

(defun deferred:url-post-content (url post-data &rest args) 
  (let ((url-request-method "POST")
        (url-request-extra-headers
         (append url-request-extra-headers
                 '(("Content-Type" . "application/x-www-form-urlencoded"))))
        (url-request-data post-data))
    (let ((d (deferred:$
               (apply 'deferred:url-retrieve url args)
               (deferred:nextc it 'deferred:url-delete-header))))
      (deferred:set-next
        d (deferred:new 'deferred:url-delete-buffer))
      d)))
ados ★★★★★
() автор топика
Ответ на: комментарий от qweqwe

Вот такой код:

(defun my:highlight-background (start end color)
  (hlt-highlight-region start end
                        `((background-color . ,color))))

(defun my:highlight-server-request ()
  (interactive "")
  (deferred:$
    (deferred:url-post-content "http://127.0.0.1:8080/"
      (buffer-string))
    (deferred:nextc it
      (lambda (buf)
        (let ((m (set-marker (make-marker)
                             0
                             buf))) 
          (catch 'loop
            (while t
              (apply #'my:highlight-background
                     (condition-case nil
                         (read m)
                       ((end-of-file) (throw 'loop nil))))))) 
        (kill-buffer buf)))))

Работает вполне всё шустро.

ados ★★★★★
() автор топика

Задача анализа кода полностью эквивалента задаче написания продвинутого компилятора.

Анализ среднестатистических распространенных говноязыков - достаточно сложное занятие, и сложности начинаются с парсинга. Грамматики у среднестатистических говноязыков не контекстно-свободные даже, не говоря уже про LL(1) какие-то, плюс тебе в процессе обхода дерева надо собирать кучу метаинформации, итд.

На емакс-лиспе я бы не советовал это все делать(больно он ущербный), а попрактиковаться сначала взяв в руки какой-нибудь нормальный язык, типа CL.

Для начала прочитай dragon book, чтобы основы знать, ну и далее смотри всякие там статьи на acm, читай всякие умные вики вроде c2, итд. На русском информации крайне мало, сразу предупреждаю, и она часто либо неадекватная, либо устаревшая, либо рассматривающая только простейшие случаи. Основы, вобщем, освоишь за годик, наверное, если стараться. За пару-тройку лет сможешь написать простенький анализатор какого-нибудь Java с выводом типов.

Успехов, так сказать.

lovesan ★★
()
Ответ на: комментарий от ados
(deferred:url-post-content "http://127.0.0.1:8080/"
	(buffer-string))

Ты тут каждый раз отправляешь весь буффер? Оно же загнется на больших файлах

qweqwe
()
Ответ на: комментарий от lovesan

Грамматики у среднестатистических говноязыков не контекстно-свободные даже

Разве? Какие, например? ЕМНИП, даже у ужасных плюсов КС грамматика

qweqwe
()
Ответ на: комментарий от qweqwe

Только лексический анализатор. Семантика - контекстно зависимая. Паскаль - идеален, там все ясно сразу на первом проходе. И лисп, да.

anonymous
()
Ответ на: комментарий от qweqwe

Ты тут каждый раз отправляешь весь буффер? Оно же загнется на больших файлах

У меня оно почему-то иногда передаёт обрезанный буфер до некоторой длины.

ados ★★★★★
() автор топика
Последнее исправление: ados (всего исправлений: 2)

стоп-стоп! ща я тебе посоветую одного чела и его проект, он 1С код анализировал уже. и довольно успешно.

если интересно, стуканись ко мне, я тебе его контакты скину.

bvn13 ★★★★★
()
Последнее исправление: bvn13 (всего исправлений: 1)
Ответ на: комментарий от ados

можно так еще

(buffer-substring-no-properties 1 (point-max))
но оно в любом случае неюзабельно будет. Тебе этот анализатор для одной лишь подсветки нужен?

qweqwe
()
Ответ на: комментарий от anonymous

Посмотрел я lex(bison). ИМХО туфта какая-то. Может кто что скажет про различные peg генераторы?

ados ★★★★★
() автор топика
Ответ на: комментарий от qweqwe

Тебе этот анализатор для одной лишь подсветки нужен?

Понимаю, что мелочно. Но помаленьку в область вхожу, утиль осваиваю.

ados ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.