Вместо стандартного определения (с удовольствием заменю, если оно существует) я определю синтаксис для умножения путем сопоставления, используя пробел между символами или выражениями, чтобы:
c = a b --> c = a * b
(Примечание: я специально не разрешаю двухсимвольное имя переменной c=ab --> c = a * b).abab
Это должно хорошо работать со скобками и порядком операций, чтобы
c = a (b + q) --> c = a * (b + q)
c = (a + p) (b + q) --> c = (a + p) * (b + q)
c = a/p b --> c = a/p*b
Похоже, что очень немногие языки (например, Wolfram Alpha) допускают такое подразумеваемое умножение. Мне интересно, почему?
Это просто боль для разбора?
Есть неясности?
Беглый поиск по ключевым словам «Практического подхода к анализу с учетом типов» [Sailor & McCorsky 1994], кажется, подразумевает, что это возможно.
Что касается голосования за закрытие из-за «в первую очередь основанного на мнении»: я не ищу мнения. Я ищу теоретические причины, по которым разбор этого будет более сложным или невозможным из-за двусмысленности.
Решение проблемы
Это не невозможно разобрать, но есть ряд проблем, которые необходимо решить.
Во- первых, x(a+b)это может быть произведение или вызов функции, в зависимости от того x, скаляр это или функция. Чтобы устранить двусмысленность, вам нужно знать, что xесть, что довольно хорошо требует обязательного объявления declare перед использованием. Даже если ваш язык строго типизирован и вы не возражаете против требования сначала объявить, вам все равно нужен несколько неуклюжий обратный канал от синтаксического анализатора к лексическому сканеру или какой-либо другой прием синтаксического анализа. (Например, Awk, который использует сопоставление для объединения строк, рассматривает это как вызов функции, если между именем функции и (.). Вы можете отложить синтаксический анализ, но может оказаться, что вам нужно повторно проанализировать все выражение, чтобы получить правильный приоритет.
Аналогичная неоднозначность с унарными операторами. Достаточно легко настаивать на том, что a -bэто вычитание, так что произведение будет записано в круглых скобках -- a(-b)-- но это усложняет грамматику.
Приоритет также может сбивать с толку людей, читающих код. Учитывайте n!/k!(n-k)!; если это правильный способ записи выражения, сопоставление должно иметь более высокий приоритет, чем деление, но есть те, кто думает, что сопоставление и произведение должны иметь одинаковый приоритет. (В эту группу входят некоторые авторы стандарта измерений SI, который рекомендует не использовать сопоставление для записи измерений, когда тип выражения имеет умноженный знаменатель.)
Короче говоря, синтаксис, предположительно предназначенный для улучшения читабельности, может привести к путанице и даже незначительным ошибкам. Это, а также увеличение сложности синтаксического анализа, поднимает вопрос о том, сколько реальной пользы в том, чтобы исключить несколько *s.
Комментариев нет:
Отправить комментарий