Лекция 01. Тема Общая характеристика языков программирования высокого уровня


Download 4.1 Mb.
Pdf ko'rish
bet56/57
Sana12.11.2023
Hajmi4.1 Mb.
#1767546
TuriЛекция
1   ...   49   50   51   52   53   54   55   56   57
Bog'liq
Lektsii po YaP Lukinova 2 sem

 
< идентификатор > 

A | B | C
 
<выражение> 

< идентификатор > + <выражение>
 
| < идентификатор > * <выражение>
 
| (< выражение > )
 
| < идентификатор > 
 
Эта грамматика описывает оператор присваивания с операциями “+”, “-“
и круглыми скобками. Например, оператор А := В * ( А + С ) порождается 
следующим выводом
 
<присвоить> => < идентификатор > := <выражение>
 


=> А := <выражение>
 
=> А := < идентификатор > * <выражение>
 
=> А := В * <выражение>
 
=> А := В * ( <выражение> )
 
=> А := В * (< идентификатор > + <выражение> )
 
=> А := В * ( А + <выражение> )
 
=> А := В * ( А + < идентификатор > )
 
=> А := В * ( А + С )
 
Структуру полученного вывода можно отобразить с помощью 
синтаксического дерева (рис.6.1).
 
Определение. Цепочка, выведенная из корня и выписанная слева направо 
из отметок листьев, называется кроной дерева.
Утверждение 1. Терминальная цепочка принадлежит языку грамматики 
тогда и только тогда, когда она является кроной, по крайней мере, хотя бы 
одного дерева разбора.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Рисунок 6.1. Пример синтаксического дерева 
Это утверждение говорит о том, что существование порождений и 
синтаксических деревьев являются равносильными понятиями.
( ( <выражение> ) 
:= 
<присвоить> 
<идентификатор> 
<выражение> 
А 

<идентификатор> 
<выражение> 
В 
С 

<идентификатор> 
<выражение> 
А 


Деревья задают порядок вычислений в арифметическом выражении, т.е. 
определяют приоритеты операций: чем ниже на дереве располагается знак 
операции, тем раньше она выполняется.
6.4 Неоднозначность грамматики выражений 
Утверждение 2. Для некоторых грамматик можно найти терминальные 
цепочки с несколькими деревьями разбора (рисунок 5.6) или с несколькими 
левыми или правыми порождениями. Такие грамматики являются 
неоднозначными.
 
Пример3. 
 
Пусть задана грамматика оператора присваивания:
 
<присвоить> 

< идентификатор > := <выражение>
 
< идентификатор > 

A | B | C
 
<выражение> 

< выражение > + <выражение>
 
| < выражение > * <выражение>
 
| (< выражение > )
 
| < идентификатор > 
 
Эта грамматика неоднозначна, т.к. вывод цепочки А:= В+С*А можно 
представить двумя деревьями (рис.6.2):
 
Причины неоднозначности грамматики выражений заключаются в 
следующем:
1. В грамматике не учтены приоритеты арифметических операций. 
2. Не определен порядок выбора правил из множества Р при выводе 
выражения.
Устранение неоднозначности состоит во введении в грамматику 
дополнительных переменных: 
a. 
множителей (сомножителей или факторов), 
b. 
слагаемых (термов).


 
 
Рисунок 6.2. Синтаксические деревья к выводу цепочки А:= В+С*А в 
неоднозначной грамматике
Множитель – это выражение, которое не может быть разделено на 
части никакой примыкающей операцией, ни “*”, ни “+”. Множителями для 
нашей грамматики могут быть:

идентификаторы,

выражения в скобках.
Терм – это выражение, которое не может быть разорвано операцией “+”. 
Для нас терм – это произведение нескольких факторов F*F*….
Тогда выражение – это любое возможное выражение, которое 
представляет сумму одного или нескольких термов.
 
:= 
<присвоить> 
<идентификатор> 
<выражение> 
А 

<выражение> 
<выражение> 
В 
<идентификатор> 
( <выражение>
С 

<идентификатор> 
<выражение> 
А 
<идентификатор> 
:= 
<присвоить> 
<идентификатор> 
<выражение> 
А 

<выражение> 
<выражение> 
А 
<идентификатор> 
( <выражение>
С 


<идентификатор> 
<выражение> 
В 
<идентификатор> 



Download 4.1 Mb.

Do'stlaringiz bilan baham:
1   ...   49   50   51   52   53   54   55   56   57




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling