Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.10.06;
Скачать: [xml.tar.bz2];

Вниз

Парсинг PHP-кода   Найти похожие ветки 

 
ProgRAMmer Dimonych ©   (2013-04-14 22:47) [0]

Нужны подсказки старших товарищей, коллег и сочувствующих. Пишу программу, которая должна брать исходники сайта на PHP, анализировать их и извлекать кое-какую информацию о взаимосвязях между отдельными процедурами/методами, выдавая в итоге определённые оценки. Детали не столь важны.

Хочу сделать всё «руками», без Lex"ов и Yacc"ов — разобраться. Литературу по теме покопал: Ахо, Ульман, Сети; Грис; Креншоу; Вирт — но кое-какие вопросы и сомнения остались. Разумеется, предполагается поддержка только какого-то подмножества языка.

[Очень много букв]

На младших курсах писал за одну ночь простенький парсер, в котором для каждой лексемы и синтаксической конструкции была отдельная процедура и код процедуры определял ожидаемый синтаксис. Сейчас хочется попробовать более цивилизованно: с автоматом в табличном представлении и описанием грамматики, скажем, в (Р)БНФ.

(Р)БНФ придётся тоже парсить :( А потом ещё мучительно строить автоматы для каждой продукции, объединять, превращать НКА в ДКА.

1. Есть ли какие-то хорошие статьи, посвящённые построению ДКА по нотации в (Р)БНФ? Отдельные этапы представляю себе, но хочется в результате получить велосипед, а не БелАЗ.


 
Pit   (2013-04-15 01:55) [1]

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


 
Dimka Maslov ©   (2013-04-15 10:48) [2]

Вроде как PHP опенсорсный? Или я ошибаюсь?


 
Дмитрий С ©   (2013-04-15 11:47) [3]


> Вроде как PHP опенсорсный? Или я ошибаюсь?

Есть такое, но мне кажется там черт ногу сломит.


 
Dimka Maslov ©   (2013-04-15 11:56) [4]


> Есть такое, но мне кажется там черт ногу сломит.


А никто не обещал, что будет легко.


 
antonn ©   (2013-04-15 11:58) [5]

но не ковырять же такой проект ради автоматов...


 
ProgRAMmer Dimonych ©   (2013-04-15 12:41) [6]

Да, опенсорсный. И даже в исходниках есть описание yaccоподобное. А добрые люди даже сконвертировали это дело в РБНФ. Просто не хочется выпиливать оттуда 90% кода, чтобы посчитать пару-тройку характеристик по исходнику. Да и «самодокументируемый код» не очень-то способствует разбирательству с теорией компиляторов на практике.


 
Kerk ©   (2013-04-15 12:55) [7]

Если я ничего не путаю, то в общем случае из БНФ у тебя получится не ДКА, а НДКА. То есть у тебя на самом деле будет два шага: БНФ->НДКА->ДКА.

Получить НДКА из БФН достаточно просто. Преобразовать НДКА в ДКА несколько сложнее, можно начать отсюда: http://www.rsdn.ru/article/alg/nka.xml


 
Kerk ©   (2013-04-15 12:56) [8]

Но я бы не мучался и взял lex/yacc :)


 
Павиа   (2013-04-15 13:45) [9]


> БНФ->НДКА->ДКА.

Что-то мне говорит, что не всё так просто. Не всякую "конструкцию" можно передать из 1 в 2 и из 2 в 3 поэтому в БНФ и НДКА применяются костыли.
Правда php язык простой.


> Но я бы не мучался и взял lex/yacc :)

Написать 3-5 функций не сложно, тем более когда есть теория.
Это при условии простого языка. Для сложного придётся вникать в сложности.


> Сейчас хочется попробовать более цивилизованно: с автоматом
> в табличном представлении и описанием грамматики, скажем,
>  в (Р)БНФ.

И кто придумал что это цивилизованный способ? Это же типичная оптимизация по скорости выполнения. Которая как и любая оптимизация носит негативный характер в плане понимания.


 
ProgRAMmer Dimonych ©   (2013-04-15 14:45) [10]

> [9] Павиа   (15.04.13 13:45)
И кто придумал что это цивилизованный способ? Это же типичная оптимизация по скорости выполнения. Которая как и любая оптимизация носит негативный характер в плане понимания.

Виноват, это моя косая формулировка. Идея в том, чтобы логика управления состояниями была максимально централизована, чтобы проще генерировать код лексера/парсера. А генерировать его надо затем, чтобы по мере необходимости расширять поддерживаемое подмножество языка. Меньше логических ошибок наляпаю :)


> [7] Kerk ©   (15.04.13 12:55)

Спасибо, ссылка выглядит многообещающе. В принципе, в том же Драконе или у Гриса НКА -> ДКА достаточно подробно описано, но несколько оторванно от практики (тонкостей реализации уже в коде).

Но (Р)БНФ -> НКА — не менее больной для меня вопрос. Там никаких скрытых хитростей нет, чтобы проще разобрать? Только свой парсер для (Р)БНФ с лексемами и и логикой?


 
TUser ©   (2013-04-15 17:13) [11]

М.В. Мозговой. Алгоритмы, языки, автоматы, компиляторы.

Там примеры на С#, но алгоритмы изложены вполне четко.


 
wicked ©   (2013-04-15 18:11) [12]

можно пойти другим путём

- читаем http://www.php.net/manual/en/tokenizer.examples.php;
- качаем сборку PHP для виндовс;
- пишем скрипт на PHP на пару десятков строк; на входе скрипта - исходный файл на PHP, на выходе - набор лексем;
- разбираем строго структурированные лексемы и радуемся жизни


 
ProgRAMmer Dimonych ©   (2013-04-15 18:33) [13]

> [12] wicked ©   (15.04.13 18:11)

Не-не, такого софта тысячи уже, да и к тому же:


> [0] ProgRAMmer Dimonych ©   (14.04.13 22:47)
Хочу сделать всё «руками», без Lex"ов и Yacc"ов — разобраться.



> [11] TUser ©   (15.04.13 17:13)

Благодарю, стиль изложения автора приятен, хотя и C# :)


 
Kerk ©   (2013-04-15 18:58) [14]

https://www.coursera.org/course/compilers


 
ProgRAMmer Dimonych ©   (2013-04-27 02:37) [15]

Позволю себе продолжить эту тему, не создавая новую. Назрело два новых вопроса, для успокоения своей совести.

Исхожу из того, что лексер — это табличный ДКА. Пусть в языке есть ключевое слово, например, PROCEDURE.

2. Верно ли, что каждая буква ключевого слова будет приводить к созданию в ДКА лексера нового состояния?
3. Верно ли, что для ключевых слов с общим префиксом (например, PROGRAM и PROCEDURE) некоторые состояния будут общими?

Или правильнее всё же делать автомат, для которого ключевое слово не отличается от идентификатора, и выделять ключевые слова на втором шаге, поиском по таблицам символов?


 
ProgRAMmer Dimonych ©   (2013-04-27 02:38) [16]

P.S.

> [14] Kerk ©   (15.04.13 18:58)

Спасибо, нагло пионерю видео. Отвечают не на все вопросы, но воспринимается намного легче, чем в книгах.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2013.10.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.003 c
2-1358341960
McLotos
2013-01-16 17:12
2013.10.06
Разбросать результат SQL-запроса по переменным


15-1366917087
О-Сознание
2013-04-25 23:11
2013.10.06
VCL построена на "сигналах-слотах"?


15-1366559274
UseSynergy
2013-04-21 19:47
2013.10.06
Ищу программистов для стартапа


15-1366626747
DevilDevil
2013-04-22 14:32
2013.10.06
Относитесь ли вы к своей профессии, как к творчеству? (Опрос)


15-1367267405
Юрий
2013-04-30 00:30
2013.10.06
С днем рождения ! 30 апреля 2013 вторник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский