Добрый день!
Если отвлечься от войны за тип данных символов, то у меня получается следующая архитектура:
1. Поставшик даных (поток) - последовательно поставляет данные.
2. Сканер потока - производит выделение отдельных лексем из потока. Сканер содержит механизм управления - распознавание тех или иных лексем может отключаться.
3. Парсер - управляет сканером и полученный поток лексем преобразует во внешнее API (SAX/STAX/...).
Сканер - самый "сложный" компонент. Он состоит из подкомпонентов:
1. Буффер ввода - отвечает за хранение загруженной информации до тех пор, пока она требуется сканеру или парсеру.
2. Детектор семейства кодировок - делает попытку обнаружения семейства кодировок по данным в буфре сканера и создаёт помошник обработки семейства кодировок.
3. Помощник обработки семейства кодировок - осуществляет выделение из буфера интересующих сканер данных. Поскольку реальное преобразование данных осуществляется только по необходимости, в большей части он просто просматривает буфер ввода на наличие интересных сканеру кодовых комбинаций.
Детекторы будут следующие:
1. UCS-4
2. UTF-16
3. EBCDIC
4. ASCII
Помошники:
1. UCS-4 BE
2. UCS-4 LE
3. UTF-16 BE
4. UTF-16 LE
5. EBCDIC
6. UTF-8
7. ASCII code set (ISO-8859-x, CP-x)
8..N. различные multibyte
PS. И вопрос: У кого-то есть полный список всех подлежащих выделению лексемм?
PS. И остаётся открытым вопрос API взаимодействия между сканером и парсером. В частности, как "таскать" текстовую информацию. Может просто как сырой поток данных, накопленный в буфере?
-- Vadim Godunko
Technoserv A/S
Rostov-on-Don, Russia
On Mon, Feb 20, 2006 at 04:51:52PM +0300, Vadim Godunko wrote:
Добрый день!
Если отвлечься от войны за тип данных символов, то у меня получается следующая архитектура:
[skip]
Очень похоже на то что у меня. Но, у меня нет детекторов
(я не делал UTF-16/32, EBCDIC) и буфер у меня конечной длинны.
Если он переполняется, то затираемые данные сохраняются в
лексемах в Unbounded_[Wide_]String.
PS. И вопрос: У кого-то есть полный список всех подлежащих выделению лексемм?
Мне хватило сл. лексем
xml_io-internals.ads: type Token is ...
Но я не реализовывал разбор DTD, там могут понадобиться другие.
PS. И остаётся открытым вопрос API взаимодействия между сканером и парсером. В частности, как "таскать" текстовую информацию. Может просто как сырой поток данных, накопленный в буфере?
У меня если данные еще в буфере, то они возвращаются как
Buffer [X .. Y], а если уже нет, то
Unbounded_String.To_String (Token.Value)
Буфер у меня хранит сырые данные если это String версия и
перекодированные в Unicode если это Wide_String версия.
--
Vadim Godunko
--
Maxim Reznik
Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти