Ваша проблема - проблема синтаксического анализа. Однако, большая проблема заключается в том, что ваш язык не syntax-directed. Это означает, что синтаксис вашего языка не соответствует его семантике. Например, рассмотрим следующую программу на вашем языке:
f g
Это может быть разобран в одном из двух способов, f
применяется к g
или g
применительно к f
. Однако синтаксис языка не делает очевидным, что будет создано одно из двух деревьев синтаксического анализа. Как правильно сказано в «EJP», «это больше, чем проблема синтаксического анализа, это проблема семантической обратной связи».
Итак, как вам сделать ваш язык синтаксисом? Давайте возьмем вызов от объектно-ориентированных языков.Например:
1 plus 2
В объектно-ориентированный язык, как JavaScript, это может быть записано как:
Number.prototype.plus = function (n) {
return this + n;
};
var sum = (1) .plus (2);
alert(sum);
Сравнивая синтаксис двух языков, которые мы видим, что единственным крупным разница - это точка перед идентификатором plus
. Это все, что нам нужно, чтобы ваш язык синтаксически ориентирован. Теперь, вы можете иметь нормальные функции:
.sum 1 2 3
Однако, вы также можете иметь синтаксические направлены функции инфиксные:
1 .plus 2
Теперь, следующие выражения уже не неоднозначные:
.f g
f .g
Однако вам все же потребуются скобки для устранения неоднозначности некоторых выражений:
(.getnum) .plus 2
Это связано с тем, что getnum
вызывается до применения plus
. Это означает plus(getnum(), 2)
. С другой стороны, getnum .plus 2
будет означать plus(getnum, 2)
, что было бы ошибкой, потому что вы не можете применить plus
к функции.
Подумайте о точке как о «применении» вашего языка. Использование точки даже позволяет иметь функции высшего порядка:
1 .(true .plus-or-minus) 2
Это то же самое, как plus-or-minus(true)(1, 2)
.
Другой альтернативой является цитировать данные, подобные им в Лиспе. Этот синтаксис намного менее шумный:
- Приложение с нормальной функцией,
sum 1 2 3
.
- Приложение функции Infix,
1 plus 2
.
- Идентификаторы кодов,
f 'g
средства f
, применяемые к g
и 'f g
средства g
применяются к f
.
- Приложение с котировкой,
'getnum' plus 2
, где 'getnum'
неявно цитируется.
- Приложение для функции более высокого порядка,
1 (true plus-or-minus) 2
.
Надеюсь, что это поможет.
Хуже того, что, если 'getnum' и' plus' являются * обеими функциями? В общем, звучит так, будто у вас будет двусмысленная грамматика. –
Что я имею в виду, если у вас есть 'def f (x)' и 'def (x) g', то что должно' f g' разрешать? –
Я думаю, что вложенные вызовы функций должны были бы использовать круглые скобки (или какой-либо другой набор символов группировки), если только он не может определить, основываясь на том, что getnum не принимает никаких параметров. – RoyalPotato