@VZVZ
Reverse-Engineer, Software Developer, Architect

Хорош ли мой подход к созданию своего алгоритма движка разбора JSON, XML, HTML, CSS? А что насчет разбора кода на ЯП?

Не то чтобы он даже мой, просто никаких иных решений мне не доводилось где-то встречать. И в голову не лезут.
В общем, мы берем исходный код (в виде строки) и просто в цикле обходим все ее символы, if'ами проверяя что за символ, и принимая соответствующее решение (для HTML: если "<", то создать ветвь, далее парсим тэг и аттрибуты; если ">", то далее парсим содержимое, также закрытие ветви и т.д.; всем этим вспомогательным stuffом - то есть созданием, закрытием и т.д. - заняты отдельные функции, дабы не загромождать сам код парсинга)
Ну а чтобы на каждом символе помнить, где именно мы находимся и каких символов должны ожидать (находимся ли мы внутри аттрибута с кавычками, или внутри аттрибута без кавычек, или мы находимся после "<" и должны ожидать ">", или внутри ветви, и т.д.) для этого есть переменная-перечисление (вариантов местонахождения) + еще переменные.

Вопросы:

1) Хорош ли такой подход для JSON, XML/HTML, CSS?

2) Как его назвать, чтоб "по-научному" и понятно было?

3) А оправдано ли его применение для парсинга не языка разметки, а реального ЯП, скажем JS?
Или для этой задачи это слишком "велосипедно"?

4) Ничего лучше в голову не лезет, ни для ЯП, ни тем более для JSON, XML/HTML, CSS...
Может, регулярки в прямых руках будут лучше? Почему тогда их не применяют в подобных движках?
  • Вопрос задан
  • 581 просмотр
Пригласить эксперта
Ответы на вопрос 5
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Для начала изучите то, что было придумано до вас. Начните, например, с книги красного дракона.
Ответ написан
uvelichitel
@uvelichitel
habrahabr.ru/users/uvelichitel
То что вы описали называется state_machine и это обычный подход для парсинга xml. Тьюринг полный ЯП так не распарсить, например не распарсить goto. ЯП описываются EBNF или другими достаточно варазительными грамматиками и парсятся в абстрактное_синтаксическое_дерево. Парсеры EBNF могут к примеру подсматривать вперед или назад.
Ответ написан
zagayevskiy
@zagayevskiy
Android developer at Yandex
1) Нет, плох. Ничего у вас с этим подходом хорошего не выйдет.

2) Конкретно этот подход - детерминированный конечный автомат

3) Нет, не оправдано. Не получится.

4) Почитайте что-нибудь на тему теории формальных языков и грамматик. Конструирование компиляторов. Теория интерпретации компьютерных программ.
Регулярное выражение эквивалентно детерминированному конечному автомату, так что не выйдет.
Ответ написан
ruddy22
@ruddy22
Спасение утопающих — дело рук самих утопающих
VZVZ: человек, прочитайте пожалуйста книги Колмогорова Андрея Николаевича по математической логике, а также труды Чёрча по лямбда-вычислениям, а затем Интерпретация Лисп(Lisp) и Ским(scheme). Потом уже переходите к алгоритмам. Как Вам правильно посоветовали: "Изучите ТО что было ДО ..."
Ответ написан
petermzg
@petermzg
Самый лучший программист
Местоположения мало.
Взять к примеру json - {"name": "value"}
Если обрабатываешь символ "n", то находишься в документ/обьект/наименование атрибута обьекта/текст
А если символ "v", то документ/обьект/значение атрибута обьекта/текст
И таких тонкостей много.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы