Существуют ли хорошо известные алгоритмы для вывода "возвращаемых типов" правил синтаксического анализатора?

Учитывая грамматику и прилагаемый код действия, существует ли какое-либо стандартное решение для определения того, к какому типу должно привести каждое производство (и, следовательно, какого типа вызывающее производство должно ожидать от него)?

Я думаю об объектно-ориентированной программе и коде действий, в котором используется что-то вроде синтаксиса var в C# (но я не ищу что-то специфичное для C#).

Это было бы довольно просто, если бы не перегрузка функций и рекурсивные грамматики.

Проблема возникает в таких случаях:

Foo ::= 
    Bar Baz { return Fig(Bar, Baz); }
    Foo Pit { return Pop(Foo, Pit); } // typeof(foo) = fn(typeof(Foo))
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
160
2

Ответы 2

Если вы пишете код на функциональном языке, это легко; стандартный вывод типа Хиндли-Милнера отлично работает. Не делайте этого. В моем генераторе синтаксического анализатора EBNF (никогда не выпускался, но исходный код доступен по запросу), который поддерживает Icon, c и Standard ML, я на самом деле реализовал идею, о котором вы спрашиваете, для серверной части Standard ML: все типы были выведены. Полученные грамматики было практически невозможно отладить.

Если вы добавите перегрузка в микс, результатом будет только труднее отлаживать. (Правильно! Это только что! Сложнее, чем невозможно! Больше бесконечности! Прошло время отходить ко сну!) Если вы действительно хотите попробовать это сами, добро пожаловать в мой код. (Вы этого не сделаете; есть причина, по которой я его не выпустил.)

Если бы я знал что-нибудь об Icon, я бы посмотрел. (примечание: да, я знаю, что я чокнутый ... Я задаю этот вопрос как предвестник добавления [еще] вывода к этому -> dsource.org/projects/scrapple/browser/trunk/dparser/tag/…)

BCS 17.12.2008 11:04

Иконка была очень интересной; Жаль, что они слишком долго ждали, чтобы подумать об интерфейсе ОС. Его время прошло. Тем не менее, это все еще самая интересная модель обработки строк, которую я когда-либо видел. Подробное описание вывода типов см. В разделе research.microsoft.com/Users/simonpj/papers/higher-rank/….

Norman Ramsey 18.12.2008 05:33

Возвращаемое значение грамматического действия на самом деле не отличается от локальной переменной, поэтому вы должны иметь возможность использовать вывод типа C# для выполнения этой работы. См. Эта бумага для некоторого понимания того, как реализован вывод типа C#.

Стандартный способ вывода типа - это Алгоритм Хиндли-Милнера, но он не обрабатывает перегрузку из коробки.

Обратите внимание, что даже генераторы парсеров для языков с выводом типов обычно не определяют типы грамматических действий. Например, окамлячк требует аннотаций типов. Генератор парсера Счастливый для Haskell может использовать вывести типы, но, похоже, препятствует такой практике. Это может указывать на то, что определение типов в грамматике сложно, плохая идея или и то, и другое.

[ОБНОВЛЕНИЕ] Очень много выдвинул Норман Рэмси, у которого есть горький опыт.

Другие вопросы по теме