Максимальный перекус

редактировать

В компьютерном программировании и информатике « максимальное количество еды » или « максимальное совпадение » - это принцип, согласно которому при создании некоторой конструкции необходимо использовать как можно большую часть доступного ввода.

Самое раннее известное использование этого термина принадлежит Р.Г. Кеттеллу в его докторской диссертации по автоматическому созданию генераторов кода для компиляторов.

СОДЕРЖАНИЕ
  • 1 Приложение
  • 2 Недостатки
  • 3 альтернативы
  • 4 ссылки
  • 5 Библиография
Заявление

Например, лексический синтаксис многих языков программирования требует, чтобы токены были построены из максимально возможного количества символов из входного потока. Это сделано для решения проблемы неоднозначности, присущей часто используемым регулярным выражениям, таким как [a-z]+(одна или несколько строчных букв).

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

Недостатки

В некоторых ситуациях «максимальный перекус» приводит к нежелательным или не интуитивным результатам. Например, в языке программирования C оператор x=y/*z;(без пробелов), вероятно, приведет к синтаксической ошибке, поскольку /*последовательность символов инициирует (непреднамеренный) комментарий, который либо не завершается, либо завершается конечным токеном */некоторого более позднего, не связанного с ним фактического комментарий (комментарии в C не вкладываются). Фактически в заявлении имелось в виду присвоить переменной xрезультат деления значения yна значение, полученное путем разыменования указателя z ; это был бы вполне допустимый (хотя и не очень распространенный) код. Это можно указать, используя пробел или используя x=y/(*z);.

Другой пример, в C ++, использует символы «угловой скобки» lt;и gt;в синтаксисе для специализации шаблона, но два последовательных gt;символа интерпретируются как оператор сдвига вправо gt;gt;. До C ++ 11 следующий код вызывал ошибку синтаксического анализа, потому что вместо двух токенов с правой угловой скобкой встречался токен оператора сдвига вправо:

 std::vectorlt;std::vectorlt;intgt;gt; my_mat_11; //Incorrect in C++03, correct in C++11. std::vectorlt;std::vectorlt;intgt; gt; my_mat_03; //Correct in either C++03 or C++11.

Стандарт C ++ 11, принятый в августе 2011 года, внес поправки в грамматику, так что маркер сдвига вправо считается синонимом пары прямых угловых скобок (как в Java ), что усложняет грамматику, но позволяет продолжать использовать максимальное количество еды. принцип.

Альтернативы

Исследователи языков программирования также отреагировали, заменив или дополнив принцип максимального пережевывания другими тактиками лексической неоднозначности. Один из подходов заключается в использовании «ограничений следования», которые вместо прямого взятия самого длинного совпадения налагают некоторые ограничения на то, какие символы могут следовать за действительным совпадением. Например, указание, что после сопоставления строк [a-z]+не может следовать алфавитный символ, дает тот же эффект, что и максимальное пережевывание с этим регулярным выражением. (В контексте регулярных выражений принцип максимального пережевывания называется жадностью и противопоставляется лени. ) Другой подход состоит в том, чтобы сохранить принцип максимального пережевывания, но сделать его подчиненным некоторому другому принципу, например контексту ( например, правильному -shift токен в Java не будет соответствовать в контексте выражения обобщения, где он синтаксически недействителен).

Рекомендации
Библиография
  • Ахо, Альфред V.; Lam, Monica S.; Сетхи, Рави; Ульман, Джеффри Д. (2007). Компиляторы: принципы, методы и инструменты (2-е изд.). Бостон: Эддисон-Уэсли. ISBN   978-0-321-48681-3.
  • Пейдж, Дэниел (2009). «Составители». Практическое введение в компьютерную архитектуру. Тексты по информатике. Лондон: Спрингер. С. 451–493. DOI : 10.1007 / 978-1-84882-256-6_11. ISBN   978-1-84882-255-9.
  • Ван ден Бранд, Марк Г.Дж.; Шердер, Йерун; Винью, Юрген Дж.; Виссер, Элко (2002). Фильтры устранения неоднозначности для обобщенных LR-анализаторов без сканирования. Конспект лекций по информатике. 2304/2002. Берлин / Гейдельберг: Springer. С. 21–44. DOI : 10.1007 / 3-540-45937-5_12. ISBN   978-3-540-43369-9. ISSN   0302-9743.
  • Вандевурде, Дэвид (14 января 2005 г.). "Прямоугольные скобки". Проверено 31 марта 2010 года.
  • Ван Вик, Эрик; Швердфегер, август (2007). Контекстное сканирование для анализа расширяемых языков. GPCE '07: Труды 6-й Международной конференции по генеративному программированию и компонентной инженерии. Нью-Йорк: ACM. С. 63–72. DOI : 10.1145 / 1289971.1289983. ISBN   9781595938558.
Последняя правка сделана 2024-01-02 02:46:43
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте