Парсинг DOM, обход структурированного документа под капотом

Как разработчик, и я уверен, что я здесь далеко не один, мне всегда интересно понять, что «под капотом». Парсеры DOM для меня являются одними из лучших в этом списке. Мы все знаем известный пост . Я даже собрал немного "O RLY?" как из-за временной необходимости, так и из любопытства.

Однако моя потребность встретиться с человеком за кулисами остается неудовлетворенной. Как синтаксические анализаторы DOM или любые структурированные синтаксические анализаторы документов анализируют документы? Насколько я понимаю разработчика веб-приложений среднего уровня, это комбинация рекурсивного синтаксического анализа строк и логики сохранения состояния, мало чем отличающаяся от моей собственной хакерской попытки.

Волшебники никогда не должны раскрывать свои секреты, а если серьезно, то где он прячет кролика?


person Dan Lugg    schedule 03.04.2011    source источник


Ответы (1)


Существует хорошо разработанная теория синтаксического анализа и бессчетное количество инструментов для ее поддержки. Как правило, вы смотрите на каждого персонажа по одному и решаете, когда созданные вами символы составляют токен. Затем вы смотрите на последовательность токенов и решаете, когда последовательность токенов составляет грамматическую конструкцию более высокого уровня — в данном случае элемент HTML. Когда вы распознаете конструкции, вы строите дерево узлов для их представления — в данном случае дерево DOM.

Итак, вы знакомы с контекстно-свободными грамматиками и компиляторами-компиляторами, такими как yacc, bison и их более современными аналогами? Если вы понимаете это, синтаксический анализатор DOM не должен быть загадкой.

person Ernest Friedman-Hill    schedule 03.04.2011
comment
Спасибо, Эрнест Фридман-Хилл. Я не знаком с контекстно-свободными грамматиками. Учитывая это, я считаю, что это хорошее место для меня, чтобы начать читать. Концепция токенизации строк не совсем чужда мне, хотя детали реализации ускользнули от меня. Если у вас есть какие-либо ресурсы, чтобы предложить, я был бы рад услышать их. - person Dan Lugg; 04.04.2011
comment
Чтобы немного уточнить мой вопрос; Подходят ли регулярные выражения (или другие подобные технологии сопоставления текста) для токенизации? Используются ли они в каких-либо производственных библиотеках для этой цели? - person Dan Lugg; 04.04.2011
comment
Поколения людей узнали из Книги Дракона: amazon.com/ Компиляторы-Принципы-Методы-Инструменты-2nd/dp/ . Это как-то дорого, однако. В Интернете доступно множество ресурсов поменьше: попробуйте yacc/lex HOWTO: ds9a.nl/lex-yacc/cvs/lex-yacc-howto.html . - person Ernest Friedman-Hill; 04.04.2011
comment
Чтобы ответить на вашу разработку: да, абсолютно. Регулярные выражения используются при токенизации, распознавании локальных шаблонов, таких как «‹», за которыми следует последовательность букв, за которой следует «›». Но они недостаточно мощны, чтобы распознавать произвольно вложенные элементы HTML; для этого вы можете использовать аналогичную базовую технологию — по крайней мере, концептуально — но на более высоком уровне, используя токены в качестве основных объектов вместо символов. Синтаксический анализатор относится к потоку токенов так же, как регулярное выражение к потоку символов — если это имеет смысл. - person Ernest Friedman-Hill; 04.04.2011
comment
Отлично, большое спасибо за ваши предложения, Эрнест :) Я буду изучать Книгу Дракона, если этот интерес перерастет из любопытства в полноценное стремление к обучению. - person Dan Lugg; 04.04.2011
comment
Спасибо за этот ответ, сэр. - person Jonathan Wilson; 26.07.2012