Неудачное частичное вычисление интерпретатора арифметических выражений

1.2.6

"Неудачное" частичное вычисление
интерпретатора арифметических выражений

 

<Arex sN '*' Fact (sN '-' 1)>

 

Сделать шаг не можем, так как выбор предложения зависит от значения sN, например:

  •  
если  sN = 2, то применимо предложение с образом eX '*' eY

при 

eX = 2,
eY = Fact (2 '-' 1)
 
  •  
если  sN = '+', то применимо предложение с образом eX '+' eY

при 

eX = пустое выражение,
eY = '*' Fact ('+' '-' 1)

Что же делать?

Оказывается, наш язык арифметических выражений содержит достаточно средств для снятия таких неоднозначностей, а именно — скобки. Поставим их вокруг переменной sN, из-за которой возникла неоднозначность: 

 

Fact     {     
    0 =  1;
    sN  =  <Arex (sN) '*' Fact((sN) '-' 1)>;
}

 

и снова попытаемся вычислить обращение к Arex в общем виде (см. следующий слайд).