2009-09-24 5 views
2

Что такое проблема «зависания еще»? (Это правильное название?)Висячие еще проблемы?

Следуя стандарту кодирования на С ++ (забыл, какой), я всегда использовал скобки (блок) с контрольными структурами. Так что у меня нет , как правило, эта проблема (к которой относится «если» используется последний (?) ), но для понимания возможных проблем в иностранный код было бы неплохо с четким пониманием этой проблемы. Я помню, как читал об этом в книге около Паскаля много лет назад, но я не могу найти эту книгу.

+4

Я считаю, что это было бы «болтается еще» проблема. http://en.wikipedia.org/wiki/Dangling_else –

ответ

5

Кому if принадлежит else?

if (a < b) 
    if (c < d) 
     a = b + d; 
    else 
     b = a + c; 

(Очевидно, что вы должны игнорировать отступа.)

Это "висит еще проблема".

C/C++ избавляется от двусмысленности, имея правило, которое говорит, что вы не можете иметь ап- if -Без-ап- else как if -Боди из годов- if -с-годов- else.

+1

Я никогда не понимал проблему, если честно. Я неопытен в области языков, но каждый, который я использовал, определяет поведение просто отлично.если вместо этого проблема заключалась в том, что (1) если (some_condition) a = 1; ; else b = 1; то это совершенно другой поток контроля в C (по сравнению с потоком, который вы опубликовали), например. –

+0

Проблема в том, что отступы говорят одно, а язык говорит другое. Это не проблема в C#, потому что редактор исправляет отступ, чтобы он соответствовал интерпретации языка. –

+3

@Steven: Я не программист на C#, и поэтому я могу ошибаться, но я не знал, что есть один и только один редактор. ;) – Troubadour

9

Неоднозначные другие.

Некоторая информация здесь: http://theory.stanford.edu/~amitp/yapps/yapps-doc/node3.html

Но классический пример:

if a then 
    if b then 
    x = 1; 
    else 
    y = 1; 

против

if a then 
    if b then 
    x = 1; 
else 
    y = 1; 
+4

С точки зрения парсера проблема состоит в том, что вы не можете разрешить неоднозначность из производств только в грамматике языка. Парсеру нужна дополнительная информация, в частности правило, в котором говорится, как его решить. (Все языки, которые я знаю, имеют правило, которое говорит, что else связывается с последним if.) –

1

Глядя на это из дизайнерского Langauge точки зрения.

Стандарт BNF -как грамматика if - else:

Statement :- .. STUFF.. 
      | IfStatement 

IfStatement :- IF_TOKEN '(' BoolExpression ')' Statement IfElseOpt 

IfElseOpt :- /* Empty */ 
      | ELSE_TOKEN Statement 

Теперь с точки зрения парсеров:

if (cond1) Statement1 
    if (cond2) Statement2 
else Statement3 

Когда вы дойдете до ELSE_TOKEN анализатор имеет два варианта, SHIFT или СНИЖИТЬ. Проблема в том, что для выбора требуется другое правило, которому должен следовать парсер. По умолчанию для большинства генераторов парсеров используется SHIFT.

+2

За исключением того, что C++ обычно не обрабатывается парсером shift-reduce (например, LR (k)). ;) – avakar

+0

Возможно нет. Но __concept__ тот же, и я не хотел обсуждать все потенциальные схемы синтаксического анализа, поскольку он действительно не казался relavant. –

-1

Я не вижу проблемы для pascal?

Это неправильный отступ.

if a then 
    if b then 
    x = 1; 
    else 
    y = 1; 

Снятие полуколонки после x = 1 сделает ее правильно отступом.

Это один правильно отступом

if a then 
    if b then 
    x = 1; 
else 
    y = 1; 
Смежные вопросы