Библиотека синтаксического анализа C ++ с поддержкой UTF-8 - PullRequest
9 голосов
/ 09 декабря 2011

Допустим, я хочу создать синтаксический анализатор для языка программирования (EBNF уже известен) и хочу, чтобы это было сделано с минимальными усилиями.Также я хочу поддерживать идентификаторы любых букв UTF-8.И я хочу, чтобы это в C ++.

flex / bison имело несуществующую поддержку UTF-8, как я читал.ANTLR, похоже, не имеет рабочего вывода C ++.

Я рассмотрел boost :: spirit , на своем сайте они заявляют, что на самом деле он не предназначен для полного синтаксического анализатора.* Что еще осталось?Роллинг это полностью за руку?

Ответы [ 2 ]

6 голосов
/ 24 декабря 2011

Если вы не можете найти то, что имеет необходимую поддержку, не забывайте, что flex в основном не зависит от кодировки.Он лексирует поток октетов, и я использовал его для лексизации чистых двоичных данных.То, что закодировано в UTF-8, является потоком октетов и может быть обработано с помощью flex, если вы согласитесь выполнить часть работы вручную.IE вместо

idletter [a-zA-Z]

, если вы хотите принять в качестве букв все, что в диапазоне от Latin1, кроме NBSP (другими словами, в диапазоне U00A1-U00FF), вы должны сделать что-то вродеиспортили кодировку, но вы поняли)- \ u00FF] by \ xC2 [\ xA1- \ xFF] | \ xC3 [\ x80- \ xBF], объем работы препроцессора зависит от того, насколько универсальным будет ваш ввод, будет времявероятно, лучше интегрировать работу в flex и внести ее в основной поток)

3 голосов
/ 24 декабря 2011

Парсер работает с токенами, его кодировка не обязательна. Обычно он просто сравнивает идентификаторы токенов, и в случае, если вы кодируете свои особые правила, вы можете сравнить подчеркивающие строки UTF-8 так, как вы это делаете где-либо еще.

Так вам нужен лексер UTF-8? Ну, это сильно зависит от того, как вы определите свою проблему. Если вы определили свои идентификаторы, которые состоят из буквенно-цифровых символов ASCII и чего-либо еще, кроме ASCII, то flex вполне удовлетворит ваши потребности. Если вы действительно хотите передать диапазоны Юникода на лексер, вам понадобится нечто более сложное. Вы можете посмотреть на Quex . Я никогда не использовал его сам, но он утверждает, что поддерживает Unicode. (Хотя я бы кого-нибудь убил за «бесплатную информацию / поиск по индексам персонажей»)

РЕДАКТИРОВАТЬ: Вот аналогичный вопрос , он утверждает, что flex не будет работать из-за ошибки, которая игнорирует, что некоторые реализации могут иметь подписанный символ ... Это может быть хотя устарел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...