Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] FParsec Tutorial #12

Open
wants to merge 14 commits into
base: master
Choose a base branch
from

Conversation

FoggyFinder
Copy link
Member

Добавил перевод к "Parsing a float between brackets"

Copy link
Member

@Neftedollar Neftedollar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Отличный перевод. Вопрос только по двум незначительным словам.

Реализация парсеров с `FParsec` обычно означает комбинирование высокоуровневых парсеров основанных на парсерах низкого уровня.
Вы начнете с парсеров примитивов предоставляемых библиотекой, а затем будете последовательно их комбинировать в высокоуровневые до тех пор, пока вы наконец не получите один парсер для полных входных данных.

В этом учебнике мы проиллюстрируем этот подход обсуждением различных простых парсеров, которые строятся друг на друге.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

строятся друг на друге

"основываются друг на дргуе" звучит лучше

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

Парсер `p1 >>. p2` последовательно парсит `p1` и `p2` и возвращает результат `p2`.
Парсер `p1 .>> p2` также последовательно парсит `p1` и `p2`, но возвращает результат `p1` вместо `p2`.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

но возвращает результат p1 вместо p2.

"но уже возвращает p1, а не p2" так по моему лучше, т.к. убиарем слвоо "вместо" которое наводит на мысли о каких-то заменах. А здеь говорится о различиях.

@FoggyFinder FoggyFinder changed the title FParsec Tutorial [WIP] FParsec Tutorial May 7, 2017

These are all trivial examples, of course. But since FParsec is merely an F# library and not some external parser generator tool, there are no limits to the abstractions you can define.
You can write functions that take whatever input you need, do some arbitrarily complex computations on the input and then return a special purpose parser or parser combinator.
Конечно, все эти примеры тривиальны. Но, поскольку, `FParsec` это только F#-библиотека, а не какой-нибудь внешний инструмент для генерации парсеров, здесь ограничений на абстракции, которые вы можете определить.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

здесь ограничений

Пропущено "нет"

For example, you could write a function that takes a regular‐expression pattern as the input and returns a Parser for parsing input conforming to that pattern.
This function could use another parser to parse the pattern into an AST and then compile this AST into a special‐purpose parser function.
Alternatively, it could construct a .NET regular expression from the pattern and then return a parser function that uses FParsec’s CharStream API to directly apply the regex to the input stream (which is what the built‐in regex parser actually does).
Например, вы можете написать функцию, которая принимает паттерн регулярного выражения в качестве входного параметра и возвращает `Parser` для разбора входных данных в соответствии с этим шаблоном.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. Предложение получилось довольно сложным, можно его немного упростить, например убрав слово "входного" из "которая принимает паттерн регулярного выражения в качестве входного параметра"
  2. Стоит изменить или слово паттерн или слово шаблон, т.к. "которая принимает паттерн" и "разбора входных данных в соответствии с этим шаблоном" сложно линкуются в голове. Не сразу понимаешь, что шаблон это тот саммый паттерн из начала предложения.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Neftedollar понял, хотел избавиться от тавтологии, похоже вышло не очень удачно

This function could use another parser to parse the pattern into an AST and then compile this AST into a special‐purpose parser function.
Alternatively, it could construct a .NET regular expression from the pattern and then return a parser function that uses FParsec’s CharStream API to directly apply the regex to the input stream (which is what the built‐in regex parser actually does).
Например, вы можете написать функцию, которая принимает паттерн регулярного выражения в качестве входного параметра и возвращает `Parser` для разбора входных данных в соответствии с этим шаблоном.
Эта функция может использовать другой парсер для разбора шаблона в АСД а затем компилировать его в специальную функцию парсинга.
Copy link
Member

@Neftedollar Neftedollar May 9, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

я бы дописал к АСД(Абстрактное синтаксическое дерево) , т.к. раньше, вроде нигде про АСД не упоминалось, пришлось напрячься, чтоб понять что тут имеется ввиду под АСД. Т.к. уже пользовался FParsec, то это было легко, а люди будут гуглить аббревиатуру.

Alternatively, it could construct a .NET regular expression from the pattern and then return a parser function that uses FParsec’s CharStream API to directly apply the regex to the input stream (which is what the built‐in regex parser actually does).
Например, вы можете написать функцию, которая принимает паттерн регулярного выражения в качестве входного параметра и возвращает `Parser` для разбора входных данных в соответствии с этим шаблоном.
Эта функция может использовать другой парсер для разбора шаблона в АСД а затем компилировать его в специальную функцию парсинга.
В качестве альтернативы можно построить регулярное выражение .Net из шаблона и затем вернуть функцию-парсер, которая использует `CharStream` API из `FParsec` для того, чтобы непосредственно применить регулярное выражение к входному потому (на самом деле это как раз то, что делает встроенный парсер `regex`).
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Another example are extensible parser applications.
By storing parser functions in dictionaries or other data structures and defining an appropriate extension protocol, you could allow plugins to dynamically register new parsers or modify existing ones.
Другой пример - расширяемое приложение-парсер.
Сохраняя функции парсинга в словаре или другой структуре данных и определяя расширяющий протокол, вы можете позволить плагину динамически регистрировать новые парсеры или изменять существующие.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

тут имелось ввиду "определив расчширяющий протокол, вы можете позволить плагинам..."

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Neftedollar не уверен, что понял разницу. Более явно выраженный порядок действий?
Но звучит лучше, тогда заменю еще "сохраняя" на "сохранив", чтобы не было рассогласования.

```

принимает строку в качестве первого аргумента и возвращает парсер для этой строки.
Когда этот парсер применяется к входному потоку он проверяет совпадают ли символы из входного потока с заданной строкой.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

к входному потоку он проверяет совпадают

Нужна запятая перед он.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

он проверяет совпадают ли

Нужна запятая после проверяет.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gsomix почему?

Copy link
Contributor

@gsomix gsomix May 9, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Главное предложение: он проверяет
Что? совпадают ли символы
Когда? когда парсер применяется

@@ -0,0 +1,49 @@
# Абстрактные парсеры

Одна из самых сильных сторон `FParsec` - легкость с которой вы можете определить ваш собственный абстрактный парсер.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

легкость с которой вы можете

Нужна запятая после легкость.


На самом деле, вам не нужно определять `between`, т.к. такой комбинатор уже [есть](http://www.quanttec.com/fparsec/reference/primitives.html#members.between) в библиотеке `FParsec`.

Конечно, все эти примеры тривиальны. Но, поскольку, `FParsec` это только F#-библиотека, а не какой-нибудь внешний инструмент для генерации парсеров, здесь нет ограничений на абстракции, которые вы можете определить.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Но, поскольку, FParsec

Поскольку -- это союз. Запятые не нужны.

На самом деле, вам не нужно определять `between`, т.к. такой комбинатор уже [есть](http://www.quanttec.com/fparsec/reference/primitives.html#members.between) в библиотеке `FParsec`.

Конечно, все эти примеры тривиальны. Но, поскольку, `FParsec` это только F#-библиотека, а не какой-нибудь внешний инструмент для генерации парсеров, здесь нет ограничений на абстракции, которые вы можете определить.
Вы можете написать функцию, которая принимает те входные данные которые вам нужны, выполняет некоторые сложные произвольные вычисления и затем возвращаем парсер специального назначения или парсер-комбинатор.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

которая принимает те входные данные которые вам нужны

Повторение которые. Может исправить так?

которая принимает нужные вам входные данные

Другой пример - расширяемое приложение-парсер.
Сохранив функции парсинга в словаре или другой структуре данных и определив расширяющий протокол, вы можете позволить плагину динамически регистрировать новые парсеры или изменять существующие.

Возможности действительно неограниченны. Но, прежде, чем вы сможете полностью их использовать, вам нужно познакомиться с основами `FParsec`.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Но, прежде, чем вы

Прежде чем используется в значении союза. Запятые не нужны.

@gsomix
Copy link
Contributor

gsomix commented May 9, 2017

Пожалуй, лучше править орфографические ошибки самому, чем описывать каждую из них в комментариях к PR. То, что я заметил, поправлю после мержа. :)

@FoggyFinder Спасибо за перевод! Это круто.

Dmitriy Vlasov and others added 2 commits August 18, 2017 11:53
Загрузил свою версию перевода учебника FParsec  для слияния.
@Neftedollar
Copy link
Member

@DmitriyVlasov спасибо!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants