-
Notifications
You must be signed in to change notification settings - Fork 12
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
base: master
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Отличный перевод. Вопрос только по двум незначительным словам.
Реализация парсеров с `FParsec` обычно означает комбинирование высокоуровневых парсеров основанных на парсерах низкого уровня. | ||
Вы начнете с парсеров примитивов предоставляемых библиотекой, а затем будете последовательно их комбинировать в высокоуровневые до тех пор, пока вы наконец не получите один парсер для полных входных данных. | ||
|
||
В этом учебнике мы проиллюстрируем этот подход обсуждением различных простых парсеров, которые строятся друг на друге. |
There was a problem hiding this comment.
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`. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
но возвращает результат
p1
вместоp2
.
"но уже возвращает p1
, а не p2
" так по моему лучше, т.к. убиарем слвоо "вместо" которое наводит на мысли о каких-то заменах. А здеь говорится о различиях.
FParsec/4. Abstracting parsers.md
Outdated
|
||
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#-библиотека, а не какой-нибудь внешний инструмент для генерации парсеров, здесь ограничений на абстракции, которые вы можете определить. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
здесь ограничений
Пропущено "нет"
FParsec/4. Abstracting parsers.md
Outdated
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` для разбора входных данных в соответствии с этим шаблоном. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- Предложение получилось довольно сложным, можно его немного упростить, например убрав слово "входного" из "которая принимает паттерн регулярного выражения в качестве входного параметра"
- Стоит изменить или слово паттерн или слово шаблон, т.к. "которая принимает паттерн" и "разбора входных данных в соответствии с этим шаблоном" сложно линкуются в голове. Не сразу понимаешь, что шаблон это тот саммый паттерн из начала предложения.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Neftedollar понял, хотел избавиться от тавтологии, похоже вышло не очень удачно
FParsec/4. Abstracting parsers.md
Outdated
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` для разбора входных данных в соответствии с этим шаблоном. | ||
Эта функция может использовать другой парсер для разбора шаблона в АСД а затем компилировать его в специальную функцию парсинга. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
я бы дописал к АСД(Абстрактное синтаксическое дерево) , т.к. раньше, вроде нигде про АСД не упоминалось, пришлось напрячься, чтоб понять что тут имеется ввиду под АСД. Т.к. уже пользовался FParsec, то это было легко, а люди будут гуглить аббревиатуру.
FParsec/4. Abstracting parsers.md
Outdated
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`). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
может записать так? (на самом деле это как раз то, что делает встроенный парсер regex
)
FParsec/4. Abstracting parsers.md
Outdated
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. | ||
Другой пример - расширяемое приложение-парсер. | ||
Сохраняя функции парсинга в словаре или другой структуре данных и определяя расширяющий протокол, вы можете позволить плагину динамически регистрировать новые парсеры или изменять существующие. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
тут имелось ввиду "определив расчширяющий протокол, вы можете позволить плагинам..."
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Neftedollar не уверен, что понял разницу. Более явно выраженный порядок действий?
Но звучит лучше, тогда заменю еще "сохраняя" на "сохранив", чтобы не было рассогласования.
``` | ||
|
||
принимает строку в качестве первого аргумента и возвращает парсер для этой строки. | ||
Когда этот парсер применяется к входному потоку он проверяет совпадают ли символы из входного потока с заданной строкой. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
к входному потоку он проверяет совпадают
Нужна запятая перед он
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
он проверяет совпадают ли
Нужна запятая после проверяет
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@gsomix почему?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Тут сложноподчиненное предложение, части которого нужно выделять запятыми.
Главное предложение: он проверяет
Что? совпадают ли символы
Когда? когда парсер применяется
FParsec/4. Abstracting parsers.md
Outdated
@@ -0,0 +1,49 @@ | |||
# Абстрактные парсеры | |||
|
|||
Одна из самых сильных сторон `FParsec` - легкость с которой вы можете определить ваш собственный абстрактный парсер. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
легкость с которой вы можете
Нужна запятая после легкость
.
FParsec/4. Abstracting parsers.md
Outdated
|
||
На самом деле, вам не нужно определять `between`, т.к. такой комбинатор уже [есть](http://www.quanttec.com/fparsec/reference/primitives.html#members.between) в библиотеке `FParsec`. | ||
|
||
Конечно, все эти примеры тривиальны. Но, поскольку, `FParsec` это только F#-библиотека, а не какой-нибудь внешний инструмент для генерации парсеров, здесь нет ограничений на абстракции, которые вы можете определить. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Но, поскольку,
FParsec
Поскольку
-- это союз. Запятые не нужны.
FParsec/4. Abstracting parsers.md
Outdated
На самом деле, вам не нужно определять `between`, т.к. такой комбинатор уже [есть](http://www.quanttec.com/fparsec/reference/primitives.html#members.between) в библиотеке `FParsec`. | ||
|
||
Конечно, все эти примеры тривиальны. Но, поскольку, `FParsec` это только F#-библиотека, а не какой-нибудь внешний инструмент для генерации парсеров, здесь нет ограничений на абстракции, которые вы можете определить. | ||
Вы можете написать функцию, которая принимает те входные данные которые вам нужны, выполняет некоторые сложные произвольные вычисления и затем возвращаем парсер специального назначения или парсер-комбинатор. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
которая принимает те входные данные которые вам нужны
Повторение которые
. Может исправить так?
которая принимает нужные вам входные данные
FParsec/4. Abstracting parsers.md
Outdated
Другой пример - расширяемое приложение-парсер. | ||
Сохранив функции парсинга в словаре или другой структуре данных и определив расширяющий протокол, вы можете позволить плагину динамически регистрировать новые парсеры или изменять существующие. | ||
|
||
Возможности действительно неограниченны. Но, прежде, чем вы сможете полностью их использовать, вам нужно познакомиться с основами `FParsec`. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Но, прежде, чем вы
Прежде чем
используется в значении союза. Запятые не нужны.
Пожалуй, лучше править орфографические ошибки самому, чем описывать каждую из них в комментариях к PR. То, что я заметил, поправлю после мержа. :) @FoggyFinder Спасибо за перевод! Это круто. |
Загрузил свою версию перевода учебника FParsec для слияния.
@DmitriyVlasov спасибо! |
Добавил перевод к "Parsing a float between brackets"