Как назвать направление в программировании, занимающееся алгоритмами парсинга/разбора JSON, XML, др. языков?
Разумеется, я говорю не о тех случаях, когда берут готовую библиотеку вроде Json.NET и что-то там парсят.
И не о тех случаях, когда нужно распарсить что-то в рамках конкретной задачи, и его тупо парсят регуляркой или через IndexOf/Substring.
Говорю я именно о тех случаях, когда пишут алгоритм разбора, полностью поддерживающий некий язык. Как тот самый Json.NET. Или скажем для интерпретатора, компилятора или IDE. Или для браузерного движка.
Спасибо и на том, но я не в реальных исходниках ковыряться хотел бы, пусть они даже и "stupid"... И язык D - слабо понятный для меня. Хотя в глаза его и видел, но писать ессно ничего реального не писал.
abcd0x00: а если у меня сразу все идет в дерево (скажем, DOM-дерево)?
Есть цикл, обходящий символы, в нем конечный автомат - switch, и вот в case'ах прямо сразу создаются объекты классов, таких, как HtmlDocument, HtmlElement, элементы запихиваются в коллекции childNodes и т.д.
VZVZ: синтаксический был бы нужен, если бы надо было установить, например, правильная ли последовательность полученных узлов. К примеру, ты ожидаешь (текст, текст, текст, картинка, текст), а поступает (текст, текст, картинка, текст, текст).
Множество всех цепочек, которые ты ожидаешь, образует язык.
abcd0x00: т.е. после лексического анализа я уже имею AST, а синтаксический анализ выявляет в нем, скажем, вот такие ошибки:
private void Foo()
{
class Bar // класс запихнули в метод, а надо наоборот
{
}
}
Верно?
Но почему это не делают сразу при лексическом анализе?
VZVZ: после лексического анализа у тебя есть только поток лексем. Синтаксический анализ заканчивается построением синтаксического дерева.
Но почему это не делают сразу при лексическом анализе?
Потому что лексем нет.
Ты ожидаешь (текст, текст, текст, картинка, текст), но при этом даже первый текст не получил.
При этом ожидать можно сотню разных цепочек (язык).
VZVZ: ничего ты не строишь, ты просто переводишь входной поток символов в поток лексем (узел такой, узел другой и так далее), а потом поток лексем - в выходной поток символов.
Если неправильное DOM-дерево подать, он не сможет определить, что оно неправильное. А синтаксический анализатор сможет.
abcd0x00: в каком смысле неправильное?
С незакрытыми тэгами? Сможет.
Или вот такое?
<body>
<html>
</html>
</body>
Тоже сможет в принципе. Я могу каждый узел перед добавлением проверять (по родителям и др). Что это тогда?
abcd0x00: ладно. Вообще-то я не спорю. Просто я не понимаю, как архитектурно отделить лексический анализ от синтаксического, чтобы не валить все в кучу спагетти.
Как должен выглядеть поток лексем, полученный из вашего "этого", чтобы с ним потом мог легко работать синтаксический анализатор?
Вот так сойдет?
Массив строк:
VZVZ: лексема - это пара (тип, значение) или (имя, нагрузка).
Вот два фрагмента:
В первом есть закрывающая угловая скобка <a>text
поэтому получится (<открывающий тег>, "a"), (<текст>, "text")
Во втором нет закрывающией угловой скобки, есть пробел <a text
поэтому получится (<открывающий тег>, "a"), (<атрибут>, "text")
Дальше всё точно так же разбирается. В результате получается поток лексем, где лексема - это пара. И вот этот поток уже подаётся в синтаксический анализатор. А тот уже определяет, как эти лексемы могут быть расположены.