Regex / CTFG в F # /. Net - PullRequest
       4

Regex / CTFG в F # /. Net

2 голосов
/ 04 июня 2011

Я хотел бы знать, как делать регулярные выражения или контекстно-свободные грамматики в F #.

У меня есть некоторый опыт работы с F #, (Я никогда не видел / не использовал Активные паттерны, (он явно был исключен из курса, который я сделал для временных ограничений)) и я сделал несколько регулярных выражений в Python, а также регулярные выражения и грамматики с точки зрения конкретной математики.

Я немного осмотрелась, я немного тупой. документация MSDN для regex мне не так понятна.

Я был немного разочарован, обнаружив, что

match str with
|a + "." + b + "." + c -> Some(a,b,c)
|[] -> None

не работает.

Я подозреваю, что подобного эффекта можно достичь с помощью активных паттернов

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

Ответы [ 5 ]

3 голосов
/ 04 июня 2011

Документация MSDN для regex мне не так понятна.

Для простого случая соответствия строки регулярному выражению это не может быть проще:

open System.Text.RegularExpressions
let r = Regex("^a*$")
r.IsMatch("a")
> val it : bool = true
r.IsMatch("b")
> val it : bool = false

Замените a* на требуемое регулярное выражение.Обратите внимание, что вам нужно ^ и $ вокруг регулярного выражения для полного соответствия.

Я был немного разочарован, обнаружив, что это не сработало.

match str with
| a + "." + b + "." + c -> Some(a,b,c)
| [] -> None

Шаблоны F # предназначены для сопоставления и связывания частей вложенных древовидных структур данных (алгебраических типов данных), а не для строк и обычных языков, поэтому это не работает.

IПодозреваю, что подобного эффекта можно достичь с помощью активных паттернов

Да, вы можете пройти долгий путь к достижению этого эффекта, используя активные паттерны.У Криса Смита есть статья, показывающая подробности (как впервые опубликовано Брайаном).

http://blogs.msdn.com/b/chrsmith/archive/2008/02/22/regular-expressions-via-active-patterns.aspx

Я хотел бы знать, как выполнять регулярные выражения или контекстно-свободные грамматики или оба... Я сделал несколько регулярных выражений в Python, а также регулярные выражения и грамматики с точки зрения дискретной математики.

Для сопоставления шаблонов в строках обычно используются встроенные регулярные выражения .Net, как показано выше.достаточно хорошо.Однако имейте в виду, что, несмотря на название, они не являются строго регулярными, поскольку они могут представлять больший класс языков.Как следствие, они могут не всегда иметь временную / пространственную сложность, которую вы могли бы ожидать, если бы вы использовали их в теоретических условиях.(Это также верно для Perl / Python / и т. Д.)

Что касается CFG, это совершенно другой вопрос.Fsyacc (вместе с лексером fslex) из F # PowerPack - это стандартный генератор синтаксических анализаторов F # LALR, который будет соответствовать полезному подклассу CFG.В качестве альтернативы вы можете попробовать библиотеку комбинатора синтаксического анализатора FParsec из http://www.quanttec.com/fparsec/.

1 голос
/ 04 июня 2011

Я бы предложил этот отрывок из Эксперт F #:

Использование регулярных выражений и форматирования

Он охватывает множество вопросов - использование операторов в стиле perl, сопоставление с образцом f #, активные рисунки и т. Д.

0 голосов
/ 04 июня 2011

Я никогда по-настоящему не понимал регулярных выражений, пока не прочитал первые пару глав Реализация современного компилятора в ML : тогда как типичные ресурсы по данной теме больше ориентированы на практику использования Регулярные выражения, автор этой книги излагает математические основы этого предмета (и, по крайней мере, для меня, это всегда крайне важно для моего понимания любой сложной темы, и чего-то очень не хватает в большинстве обработок в целом в более широком сообществе программистов) .

В качестве повседневного практического справочника этот сайт был полезен.

Что касается .NET Framework Regex API, с ним трудно работать, но это немного чудовищно и неудобно, так как он мало обновлялся со времени .NET 1.1 (без обобщений и немного переборщил в иерархиях наследования) , Я думаю, вам просто нужно немного поиграть с ним, чтобы почувствовать его (и F # Interactive идеально подходит для таких экспериментов).

0 голосов
/ 04 июня 2011
0 голосов
/ 04 июня 2011

Этот парень написал учебник о том, как построить полный синтаксический анализатор регулярных выражений в F #:

http://stevehorsfield.wordpress.com/2009/08/04/f-a-complete-regular-expression-processor/

http://stevehorsfield.wordpress.com/2009/07/25/f-building-a-regular-expression-pattern-parser/

...