потоковый xml парсер.

Тема в разделе "LANGS.C", создана пользователем cupuyc, 29 авг 2009.

  1. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    написал простенький парсер. разбирает только xml структуры, комменты и т. д. сорцы в аттаче. прошу высказать замечания.
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    #define XML_SYMBOL_LT (t_base_char)'<'

    Дефайны не подчиняются пространствам имен и ограничению доступа. XML_SYMBOL_LT и сотоварищи будут доступны снаружи, но компилиться это естественно не будет. Используй вместо этого статические константы.


    typedef enum ParsePrologStatus

    Ты уж определись, на чем ты пишешь, на C или на C++. Если на C++, то typedef не надо.
     
  3. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    и в каждом конструкторе инициализировать?

    х.з. сколько пишу - всегда с typedef'ом, да и на работе проект - там тож везде typedef'ы. даже и не знал что он в С++ не пишется.
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    maksim_

    Статические константы не нужно иницилизировать в каждом конструкторе. Более того, целочисленные статические константы можно инициплизировать прямо в классе.

    class blabla
    {
    public:

    static int const val = 10;
    };


    Си-стайл:

    typedef enum _tag_foo
    {
    blabla;
    } foo;

    Сипипи-стайл:

    enum foo
    {
    blabla;
    };

    Тоже самое касается и структур.
     
  5. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    ага. буду знать.
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    cupuyc
    Посмотрел, вроде ничего, работает нормально. Поддержка юникода планируется?
     
  7. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    так он и так юникодовый - реализован в виде шаблона. можно и utf-32 заюзать, если нужно. пока что utf-8, utf-16.

    Код (Text):
    1. template <typename t_base_char>
    2. class CXmlParserT
    ещё, забыл упомянуть, собирается 64х версия.
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    cupuyc
    А как тогда задействовать юникод?
     
  9. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Booster

    Вероятно - подставить wchar_t в качестве шаблонного параметра? :derisive:
     
  10. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    _DEN_
    Чего? Я хочу динамически, и не лезть в дебри библиотеки. Да и как это изменит UTF8 на UTF16?
     
  11. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Когда ты параметризуешь std::basic_string типом символа - ты лезишь в дебри библиотеки? :)


    Не знаю, сделано ли это у ТС, но с точки зрения языка никаких преград не вижу.
     
  12. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    не думаю, что юзать несколько бызовых кодировок для парсера одновременно - оптимальное решение. многие апликухи юзают, скажем, только utf-8 - зачем тогда обременять парсер лишними проверками? с точки зрения размера кода будет выигрыш, по сравнению с шаблонами, но производительность упадёт сильно.

    чтобы создать класс парсер с базовым типом utf-8 нужно всего лишь

    Код (Text):
    1. CXmlParserT<t_uchar>    parser(&handler);
    аналогично utf-16

    Код (Text):
    1. CXmlParserT<t_wchar>    parser(&handler);
    никаких сложностей в использовании не вижу.
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    _DEN_
    Покажи, где я это утверждал.
    t_wchar это ещё не юникод. Во первых кодировки разные бывают. Во вторых, что будет если у нас не юникод проект, а нам надо отпарсить юникод?
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    cupuyc
    Ну тогда всё нормально.
     
  15. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Booster

    Кодировки (windows-1251, koi-8, и т.д.) бывают только в ANSI. В UTF кодировок нет.

    Вопрос из разряда "что будет если у нас аудиоплеер, а нам надо посмотреть видео".
     
  16. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    _DEN_
    Блин, есть UTF8, UTF16, c фиксированным размером 2 байта и т.д. Хорош умничать.
    Насчёт не юникод проекта. Насколько понимаю там хардкорно служебные символы зашиты, хотя с UTF8 это прокатит.
     
  17. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Booster

    Все равно не понимаю в чем сложность. У шаблонного класса есть параметр. На его основе можно сделать type traits, function traits и любые другие traits, из которых будет компоноваться функциональность парсера. Какие проблемы? :)


    Если тип символов задается ключем, то думаю все ясно как и что сделать. Если же нужно автоматом из потока угадывать его тип символов, то лучше сделать статический парсер плюс поверх него динамическую угадывалку, поскольку вместе это функциональность может понадобиться далеко не всем.
     
  18. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    _DEN_
    У меня проблем нет, я интересуюсь есть поддержка этого или нет. Автоматическая угадывалка меня не интересует.
     
  19. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    кое-что поправил. в примере создаётся 2 парсера - utf-8 и utf-16.