Информация об изменениях

Сообщение Re: Страшная правда о lex и yacc от 21.07.2020 11:01

Изменено 21.07.2020 11:26 Aquilaware

Re: Страшная правда о lex и yacc
Здравствуйте, Эйнсток Файр, Вы писали:

ЭФ>Неужели никто этого не описывал при помощи "научного подхода"?


Самую большую работу сделал Ноел Хомский, который говорил о грамматике как о способе формального описания и построения семантической модели.

Такая вещь как lex может вызывать вопросы, но только пока вы не повертите ситуацию в разных измерениях. Я помогу вам в ваших измышлениях, дав развернутую ретроспективу.

Вот смотрите. lex — это примитивный токенизатор. Он преобразовывает поток символов в токены. На входе поток (последовательность) символов, на выходе — тоже поток, но уже токенов. Токен — это набор символов, представляющий интерес. Например, в натуральных языках токенами являются слова и разделители слов, такие как пробелы и знаки пунктуации.

Токенизатор не делает никаких попыток интерпретации данных. Все что он делает — это свертку входного потока символов в выходной поток токенов. Иногда токенизатор делает примитивную валидацию, если налагается некоторый синтаксический формализм.

Например:
вот       такое   предложение.

Если отложить стилистику в сторону, то его семантическая суть: вот такое предложение. С точки зрения смысловой семантики, эти два предложения равнозначны. Токенизатор позволяет грамматике заниматься исключительно семантикой, а не низкоуровневной задачей вылавливания слов в потоке символов. Таким образом, достигается более естественное разделения обязанностей, что несколько упрощает понимание системы. Это просто проще для мозга человека. Но это также чище с точки зрения символьной алгебры.

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

Например, исправлять стилистику текста. Для этого после токенизатора задействуют потоковый сериализатор, который формирует результатирующий текст из набора токенов, т.е. выполняет операцию, обратную токенизации. Между токенизатором и сериализатором вставляют некую функцию, которая, например, убеждается что все предложения заканчиваются на '.', '!' или '?', и что между предложениями и словами есть ровно один пробел, а между абзацами ровно одна пустая строка. В итоге мы получаем автоматическое форматирование текста.

Заметьте, что если бы токенизатора не было, и это все было бы частью семантической грамматики, то такая операция автоматического форматирования текста был бы очень тяжелой. Как минимум, она работала бы на порядок медленнее и потребляла бы на порядок больше памяти (подразумевая построение семантического дерева в памяти), чем потоковое формативание.

Если говорить об общем научном подходе, то это называется функциональной композицией. Она повсеместна. Например, в тригонометрии есть набор таких примитивов как cos(x), sin(x) и т.д. Композируя их в одну функцию (формулу), вы получаете нужный результат. Все ограничено всего лишь вашей фантазией, глубиной абстракции и хитростью, которая позволяет получать нужный результат эффективно в заданный условиях.

"Выбери минимальную дорогу, чтобы достичь нужной цели и следуй ей". Все дело в выработке цели. Если вам нужно "на коленке", то все можно засунуть и в грамматику. Если вы знаете, что понадобится не только семантика, но и форматирование и очень возможно другие потоковые операции — то нужен и токенизатор.

Во всех языковых трансляторах есть нечто подобное. Например, в XML это SAX (поток) и DOM (Document Object Model, она же семантическая модель). DOM строится поверх SAX, так же как и формальная грамматика строится поверх токенизатора.
Re: Страшная правда о lex и yacc
Здравствуйте, Эйнсток Файр, Вы писали:

ЭФ>Неужели никто этого не описывал при помощи "научного подхода"?


Самую большую работу сделал Ноел Хомский, который говорил о грамматике как о способе формального описания и построения семантической модели.

Такая вещь как lex может вызывать вопросы, но только пока вы не повертите ситуацию в разных измерениях. Я помогу вам в ваших измышлениях, дав развернутую ретроспективу.

Вот смотрите. lex — это примитивный токенизатор. Он преобразовывает поток символов в токены. На входе поток (последовательность) символов, на выходе — тоже поток, но уже токенов. Токен — это набор символов, представляющий интерес. Например, в натуральных языках токенами являются слова и разделители слов, такие как пробелы и знаки пунктуации.

Токенизатор не делает никаких попыток интерпретации данных. Все что он делает — это свертку входного потока символов в выходной поток токенов. Иногда токенизатор делает примитивную валидацию, если налагается некоторый синтаксический формализм.

Например:
вот       такое   предложение.

Если отложить стилистику в сторону, то его семантическая суть: вот такое предложение. С точки зрения смысловой семантики, эти два предложения равнозначны. Токенизатор позволяет грамматике заниматься исключительно семантикой, а не низкоуровневной задачей вылавливания слов в потоке символов. Таким образом, достигается более естественное разделения обязанностей, что несколько упрощает понимание системы. Это просто проще для мозга человека. Но это также чище с точки зрения символьной алгебры.

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

Например, исправлять стилистику текста. Для этого после токенизатора задействуют потоковый сериализатор, который формирует результатирующий текст из набора токенов, т.е. выполняет операцию, обратную токенизации. Между токенизатором и сериализатором вставляют некую функцию, которая, например, убеждается что все предложения заканчиваются на '.', '!' или '?', и что между предложениями и словами есть ровно один пробел, а между абзацами ровно одна пустая строка. В итоге мы получаем автоматическое форматирование текста.

Заметьте, что если бы токенизатора не было, и это все было бы частью семантической грамматики, то такая операция автоматического форматирования текста был бы очень тяжелой. Как минимум, она работала бы на порядок медленнее и потребляла бы на порядок больше памяти (подразумевая построение семантического дерева в памяти), чем потоковое формативание.

Если говорить об общем научном подходе, то это называется функциональной композицией. Она повсеместна. Например, в тригонометрии есть набор таких примитивов как cos(x), sin(x) и т.д. Композируя их в одну функцию (формулу), вы получаете нужный результат. Все ограничено всего лишь вашей фантазией, глубиной абстракции и хитростью, которая позволяет получать нужный результат эффективно в заданный условиях. Казалось бы, мы все проходили это еще в школе, но мозг врозслого человека настолько засорен, что мы забываем применять эту простую и звучную конструкцию которая присутствует повсеместно.

"Выбери минимальную дорогу, чтобы достичь нужной цели и следуй ей". Вся соль в выработке цели. Если вам нужно "на коленке", то все можно засунуть и в грамматику. Если вы знаете, что понадобится не только семантика, но и форматирование и очень возможно другие потоковые операции — то нужен и токенизатор.

Во всех языковых трансляторах есть нечто подобное. Например, в XML это SAX (поток) и DOM (Document Object Model, она же семантическая модель). DOM строится поверх SAX, так же как и формальная грамматика строится поверх токенизатора.