Поймите, с чем вы имеете дело

Теперь, когда у вас есть общее представление о том, о чем ваш язык, давайте изложим это на бумаге. Какие выражения есть в вашем языке? А как насчет утверждений?

Давайте сначала добавим в таблицу наиболее распространенные типы выражений. Представьте, какие типы значений поддерживает ваш язык. Есть ли в нем целые числа? Поплавки? Булевы значения? (большинство языков, по крайней мере, имеют эти три). Струны? Списки? Словари? …

Каждый тип — это выражение, потому что на самом деле это одно значение. Но как насчет операций, которые возвращают выражение, например 1 + 1? или -1? Давайте определимся, что это такое. Позвольте мне определить несколько основных типов выражений, обычно встречающихся в простом языке.

Выражения

  • Целое число -1, 0, 1, ...
  • Поплавок -1.5, 1.5, ...
  • Булево значение true, false
  • Строка "..."
  • Нуль null
  • Группа (Expression)
  • Унарный — Expression, !Expression
  • Двоичный Expression + Expression, Expression — Expression, Expression * Expression, ...
  • Переменная a, ab, abc, ...
  • Задание a = Expression, ab = Expression, abc = Expression, ...
  • Логический Expression or Expression, Expression and Expression, ...
  • Вызовы функций functionCall(), functionCall(Expression, Expresion, ...)

Довольно много для маленького языка, не так ли? Давайте немного углубимся в это. Взгляните на первые 5 выражений. Только они возвращают известное вам значение. На самом деле они называются примитивными типами и являются основой всех выражений. Обратите внимание, что остальные используют в качестве аргументов другое выражение Expression, так что на самом деле они рекурсивны. Позже мы узнаем, что после анализа исходного кода вы получите рекурсивную структуру. Это означает, что такие вещи, как:

(((1)))

Допустимое выражение, которое возвращает 1. Состоит из группы, из группы группы, содержащей 1.

Списки, словари и объекты также являются частью выражений, но они более сложны.

А что тогда с заявлениями?

Заявления

  • ExpressionStatement Expression;
  • Распечатать print Expression;
  • Блок { Statement }, { Statements }
  • If if (Expression) Block
  • Пока while (Expression) Block
  • Для for (Expression; Boolean; Expression) Block
  • Функция function name() Block, function name(Expression, Expression, ...) Block

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

В вашем дизайне могут быть вещи, отличные от тех, что я написал. Например, выражение Unary может быть другим, как в Python:

- Expression, not Expression

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

function name(...)
fun name(...)
fn name(...)
proc name(...)
method name(...)
def name(...)

Все они имеют общую структуру, не так ли? Это не просто так. Старайтесь не тормозить слишком много вещей. Кроме того, если вам нужно научить кого-то своему языку, чем меньше странных структур, тем быстрее и лучше они его выучат.

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