Взгляните на то, как работы doxygen, полный исходный код доступен, и это основано на гибком проводе.
кандидат введения в заблуждение А ЗОЛОТО , который является свободным инструментарием синтаксического анализатора на базе Windows явно для создания переводчиков. Их список поддерживаемые языки относятся к языкам, на которых может реализовать синтаксические анализаторы, не список поддерживаемых грамматик синтаксического анализа.
у Них только есть грамматики для C и C#, никакого C++.
Я использую rfc4627.erl
(я наткнулся на него, и производительность не была проблемой)
Однако я ожидаю, что разные собственные библиотеки erlang будут выполнять так же хорошо. Они делятся идеями (как видно из комментариев кода ). AFAIK mochijson
и rfc4627
используют один и тот же исходный формат erlang.
eep018 - это C, и поскольку он пытается реализовать ... hrm ... eep-0018 , собственный кодировщик term_to_json
, который может быть включен в будущую версию Erlang. Никогда не пробовал и, кажется, активно не поддерживается.
Моя последняя рекомендация - использовать mochijson (2) от mochiweb (2). Это де-факто стандарт, который активно поддерживается, в частности, CouchDB и Facebook.
В последнее время я использую jsonerl . Он основан на mochijson2 и намного проще и интуитивно понятен в использовании.
Надеюсь, этот ответ не будет воспринят плохо:
Я тоже изучил синтаксический анализ и сериализацию JSON для проекта. Мне приходилось обрабатывать много данных параллельно, так что Erlang звучал великолепно! Но многое из этого касалось строк в форме данных JSON, и здесь все пошло не так.
Как вы, наверное, знаете, строки в Erlang - это полноценные списки символов. В отличие от строк в большинстве языков (char - это «примерно» байт), каждый символ в Erlang представлен целым 32-битным целым числом! Итак, ваши строки уже довольно большие.
Поскольку это список, доступ к заданному элементу строки - O (N) вместо O (1), как вы ожидали в массиве Chars. И поскольку строки в Erlang неизменяемы, простая конкатенация может оказаться очень медленным процессом. В конце концов я понял, что просто пытался использовать неправильный язык.
По всей вероятности, вы уже знаете все эти вещи, но я счел полезным оставить это в качестве ответа для других, которые могут прийти на ваш пост в будущем.