ФБН поддерживаемых выражений на момент старта работы с репозиторием

ПРИМЕЧАНИЕ: этот текст следует читать после скачивания репозитория, чтобы у вас перед глазами были файлы проекта

Синтаксический анализатор (файл SyntaxAnalyzer.js) строит абстрактное синтаксическое дерево (АСТ)
по входящей последовательности слов. Синтаксис pascal.js-intro может быть описан следующими формами Бекуса-Наура:

<Digit> ::= [0-9]
<UnsignedInteger> ::= "0" | ([1-9] <Digit>*))
<Multiplier> ::= <UnsignedInteger> 
<Term> ::= <Multiplier> (("*" | "/")  <Multiplier>)*
<Expression> ::= <Term> (("+" | "-") <Term>)*

Можно увидеть соответствие этих форм и методов класса SyntaxAnalyzer:

  • форма <Expression> соответствует методу scanExpression,
  • <Term> --- методу scanTerm,
  • <Multiplier> --- scanMultiplier

. Это соответствие не очень подробное.

Чему, например, здесь соответствуют элементы АСТ, представляющие бинарные операции: умножение (класс Multiplication), деление (Division), сложение (Addition), вычитание (Subtraction)?

Мы можем написать для pascal.js-intro более сложные ФБН, которые описывают тот же синтаксис, но содержат больше деталей, соответствующих элементам создаваемого АСТ (также и самого синтаксического анализатора):

<Digit> ::= [0-9]
<UnsignedInteger> ::= "0" | ([1-9] <Digit>*)
<Multiplier> ::= <UnsignedInteger> 
<Multiplication> ::= ( <Multiplier> | <Multiplication> | <Division> ) "*" <Multiplier>
<Division> ::= ( <Multiplier> | <Multiplication> | <Division> ) "/" <Multiplier>
<Term> ::= <Multiplier> | <Multiplication> | <Division>
<Addition> ::= ( <Term> | <Addition> | <Subtraction> ) "+" <Term>
<Subtraction> ::= ( <Term> | <Addition> | <Subtraction> ) "-" <Term>
<Expression> ::= <Term> | <Addition> | <Subtraction>

Здесь формы соответствуют частям абстрактного синтаксического дерева. Для ясности укажем соответствующие элементы синтаксического анализатора:

  • форма <Multiplier> соответствует методу scanMultiplier (scanMultiplier возвращает только целые числа без знака),
  • <Multiplication> --- классу Multiplication,
  • <Division> --- классу Division,
  • <Term> --- методу scanTerm (scanTerm возвращает только объекты Multiplication, Division или целые числа без знака),
  • <Addition> --- классу Addition,
  • <Subtraction> --- классу Subtraction,
  • <Expression> --- методу scanExpression (scanExpression может вернуть либо отдельное слагаемое (<Term>), либо объект Addition или Subtraction).

Если требуется расширить имеющийся синтаксис, лучше всегда:

  1. сначала вносить требуемые изменения в ФБН,
  2. и только потом приводить код синтаксического анализатора в соответствие с этими ФБН.