ФБН поддерживаемых выражений на момент старта работы с репозиторием
Primary tabs
ПРИМЕЧАНИЕ: этот текст следует читать после скачивания репозитория, чтобы у вас перед глазами были файлы проекта
Синтаксический анализатор (файл 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).
Если требуется расширить имеющийся синтаксис, лучше всегда:
- сначала вносить требуемые изменения в ФБН,
- и только потом приводить код синтаксического анализатора в соответствие с этими ФБН.
- Log in to post comments
- 141 reads