здесь есть).
I>Как-то, написав цикл с выходом из середины, я обратил внимание, что если в грамматике правило
I>
I> do statement while ( expression ) ;
I>
I>заменить на
I>
I> do statement while ( expression ) statement
I>
I>, то можно будет писать
I>
I> do
I> f();
I> while (g())
I> h();
I>
I>вместо
I>
I> for (;;) {
I> f();
I> if (!g())
I> break;
I> h();
I> }
I>
I>Я бы с удовольствием пользовался этой возможностью в любом языке.
Да, но если у нас в таком языке есть while(expr) stmt и do stmt while(stmt), наряду с указаной вами грамматикой, то она является неоднозначной, что при построении компилятора, как мне кажется, не есть хорошо.
Здравствуйте, BokiyIS, Вы писали:
BIS>Да, но если у нас в таком языке есть while(expr) stmt и do stmt while(stmt), наряду с указаной вами грамматикой, то она является неоднозначной, ...
Правда? А на мой взгляд это изменение не добавляет никакой неоднозначности. Хотелось бы узнать мнение экспертов.
Здравствуйте, igna, Вы писали:
BIS>>Да, но если у нас в таком языке есть while(expr) stmt и do stmt while(stmt), наряду с указаной вами грамматикой, то она является неоднозначной, ...
I>Правда? А на мой взгляд это изменение не добавляет никакой неоднозначности. Хотелось бы узнать мнение экспертов.
На мой взгляд, компьютеру не добавляет, но человеку очень даже добавляет.
И, вообще, баян: man perlsyn. Знать бы еще, используется ли это хоть кем-то.
Я конечно не эксперт, но данная грамматика будет давать более чем одно дерева разбора для следующего предложения:
do do S1 while(E1) S2 while(E2) S3
к какому циклу вы отнесете S2, к внутренему или же к внешнему?
Хотя, такие неоднозначности можно устранить, немного переделав грамматику.
Здравствуйте, BokiyIS, Вы писали:
BIS>Я конечно не эксперт, но данная грамматика будет давать более чем одно дерева разбора для следующего предложения: BIS>do do S1 while(E1) S2 while(E2) S3 BIS>к какому циклу вы отнесете S2, к внутренему или же к внешнему? BIS>Хотя, такие неоднозначности можно устранить, немного переделав грамматику.
Всё зависит от того, что за символ после «)», закрывающей условие do-while. Сейчас там может быть исключительно «;» (что в предлагаемой грамматике соответствует пустому continue-оператору). Если же там «{» или начинается statement, то это и будет continue-block à la Perl.
Здравствуйте, BokiyIS, Вы писали:
BIS>Я конечно не эксперт, но данная грамматика будет давать более чем одно дерева разбора для следующего предложения: BIS>do do S1 while(E1) S2 while(E2) S3 BIS>к какому циклу вы отнесете S2, к внутренему или же к внешнему?
К внутреннему, между внешними do и while допускается только один statement.
I> for (;;) {
I> f();
I> if (!g())
I> break;
I> h();
I> }
I>
интересно... возможно, изобилие do и while немного запутает программиста при просмотре кода. каждый раз когда видишь while нужно будет думать, есть ли что-то перед ним или это начало цикла while().
Вот вам еще одна идея из моих наработок: часто бывает нужно отработать ситуацию, если цикл не выполнился не разу. Конечно она решается и без нововведений, но раз уж речь зашла об изобретении новых языков...