Использование функции предварительной обработки с идентификатором анализатора в FParsec? - PullRequest
5 голосов
/ 10 февраля 2012

Я использую парсер identifier из FParsec для разбора имен переменных и функций, которые обычно представляют собой смесь символов Unicode и ASCII. Но иногда я экранировал символы Юникода в начале (например, \u03C0) или внутри идентификатора (например, swipe_board\u003A_b). Я все еще могу сделать их анализируемыми, используя опции isAsciiIdStart и isAsciiIdContinue, но я не могу определить свою собственную пользовательскую функцию для предварительной обработки перед нормализацией. Что может быть решением здесь?

1 Ответ

4 голосов
/ 10 февраля 2012

Парсер identifier сначала анализирует строку, а затем передает ее в экземпляр IdentifierValidator для проверки. Поскольку класс C # IdentifierValidator общедоступен (хотя и не документирован), вы можете легко адаптировать синтаксический анализатор identifier к вашим потребностям (сделав так, чтобы начальный шаг синтаксического анализа строки также распознавал escape-коды).

Анализ идентификатора немного сложен из-за поддержки суррогатных пар UTF-16, нормализации и категории символов Unicode XID, которая изначально не поддерживается в .NET. Возможно, вам нужно поддерживать только идентификаторы ASCII или UCS-2, указанные в терминах категорий символов, поддерживаемых CharUnicodeInfo.GetUnicodeCategory, и в этом случае вы, вероятно, сможете реализовать синтаксический анализ и проверку всего за один шаг, используя many1Satisfy2 или many1Chars2.

...