ВУЗ:
глядно иллюстрирующих грамматическую структуру программы. На рис. 5.13 представлена синтаксическая диаграмма опе-
ратора if-then-else для нашего псевдокода, описанного в главе 4.
Рис. 5.13. Синтаксическая диаграмма оператора if-then-else
Эта диаграмма показывает, что структурно оператор if-then-else начинается с ключевого слова if, за которым следует
Логическое выражение. Затем указывается ключевое слово then, после которого должен присутствовать выполняемый
Оператор. Эта комбинация ключевых слов может дополняться (но необязательно) ключевым словом else и еще одним
элементом Оператор. Обратите внимание, что члены выражения, или термы, которые действительно присутствуют в опе-
раторе if-then-else, заключены в овалы, а те термы, которые подлежат дальнейшему уточнению, например Логиче-
ское выражение или Оператор, помещены в прямоугольники. Термы, подлежащие дальнейшему уточнению (т.е. те,
которые заключены в прямоугольники), называются нетерминальными (nonterminals), а термы, окруженные овалами, – тер-
минальными (terminals). В полном описании синтаксиса языка программирования нетерминальные термы описываются до-
полнительными диаграммами.
На рис. 5.14 представлен набор синтаксических диаграмм, описывающих синтаксис структуры Выражение, являющей-
ся структурой простого арифметического выражения. Первая диаграмма описывает структуру Выражение как состоящую
из компонента Терм, за которым могут вначале следовать (но необязательно) символы + или -, а затем другой компонент
Выражение. Вторая диаграмма описывает структуру компонента Терм как состоящую из отдельных символов х, у и z или
другого компонента Терм, за которым следует один из символов * или /, а потом идет некоторый компонент Выражение.
Метод, с помощью которого отдельная строка программы проверяется на соответствие некоторой совокупности син-
таксических диаграмм, можно наглядно представить с помощью дерева синтаксического анализа (parse tree) (рис. 5.15). На
нем приведено дерево синтаксического анализа следующей строки:
x + у * 2
Это дерево построено на совокупности диаграмм, представленных на рис. 5.14. Заметим, что данное дерево анализа на-
чинается расположенным вверху нетерминальным термом Выражение и на каждом очередном уровне дерева показано, как
нетерминальные термы этого уровня раскладываются на составные части, вплоть до отдельных символов, из которых и со-
стоит исходная строка.
Рис. 5.14. Синтаксическая диаграмма, описывающая структуру
простого алгебраического выражения
Процесс синтаксического анализа программы, по сути, сводится к построению дерева синтаксического анализа для ее
исходного текста. Фактически дерево синтаксического анализа отражает, как синтаксический анализатор понял грамматиче-
скую структуру программы. По этой причине синтаксические правила, описывающие эту грамматическую структуру, не
должны допускать построения двух разных деревьев синтаксического анализа для одной и той же строки, поскольку это
приведет к неоднозначности. Такие неточности могут быть практически незаметными. И действительно, показанное на рис.
5.13 синтаксическое правило содержит подобную неточность. Оно допускает построение двух разных деревьев синтаксиче-
ского анализа для одного и того же оператора, показанного ниже, что отражено на рис. 5.16:
if Bl then if В2 then S1 else S2
Заметим, что эти интерпретации существенно отличаются друг от друга. Первая предполагает, что оператор S2 будет
выполнен, если выражение В1 окажется ложным. Из второй интерпретации следует, что оператор S2 должен выполняться
только тогда, когда выражение В1 истинно, а выражение В2 ложно.
Синтаксические определения формальных языков программирования разрабатываются так, чтобы избежать подобных
неоднозначностей. В нашем псевдокоде этой проблемы можно избежать за счет применения скобок. В частности, этот опе-
ратор следовало бы записать следующим образом:
Страницы
- « первая
- ‹ предыдущая
- …
- 125
- 126
- 127
- 128
- 129
- …
- следующая ›
- последняя »