Замечания и предложения

Невозможно. Компилятор - слишком сложная структура.

Я просто наивно полагал, что так как Вы используете Yacc, это всё-таки проще, чем лезть в какой-нибудь Free Pascal.

Что значит против воли добавить. Он написал в книжке не надо использовать, кто использует - сам виноват, зачем убирать конструкцию.

Yacc - это только парсер. А вся семантика, которую Вы хотите делать, - сложна

Да, там семантика неуклюжая может получиться. Но разве в данном конкретном случае нельзя просто поменять аргументы в выражениях типа

($2 as statement_list).right_logical_bracket = $3;

или просто ввести функцию которая заключает в логические скобки узел, если последнему аргументу не за что “зацепиться” с самим узлом качестве аргумента?

Не понимаю все же. Во всех нормальных языках нельзя делать то, чего Вы так страстно возжелали. Но Вы со странным упорством уже несколько суток продолжаете “долбить”, как Вам ну просто необходимо сделать именно так. Причем нужно это Вам, да еще, быть может 1-2 людям на планете. Вашу бы энергию - да в мирных целях…

Перфекционизм, вроде называется. Вот PascalScript не позволял писать массивы a[x,y], принимал только a[x][y] синтаксис. Не вынес, допилил, сделал “как надо”

Перфекционизм хорош, пока он направлен внутрь себя и не выносит мозг другим.

1 лайк

Наверное правда, пора закрывать тему, сил у меня на самом деле не особо. Спорить о том, что лучше С и его последователи по синтаксису или Паскаль, ну это же явно провокационная тема на форуме по продукту где Паскаль пишется на C#. Но из “свеженького”, в Q# такая конструкция как я описал вроде позволена (в конце посмотрите).

А приведите код здесь

using ancilla = Qubit[1] {
    repeat {
        let anc = ancilla[0];
        H(anc);
        T(anc);
        CNOT(target,anc);
        H(anc);
        (Adjoint T)(anc);
        H(anc);
        T(anc);
        H(anc);
        CNOT(target,anc);
        T(anc);
        Z(target);
        H(anc);
        let result = M([anc],[PauliZ]);
    } until result == Zero
    fixup {
        ();
    }
}
1 лайк

А что вы будете делать в этом случае:

repeat
  if False then
  begin
    var x := 5;
  end
until x=0;

Да нет же, речь шла о том чтоб разрешить это:

repeat
  var ch := ReadChar;
until ch=ExitChar;

, без внутреннего блока… В вашем случае - если условие в if then не выполнится - x не будет инициализирована, а в коде, который я в этом сообщении написал, ch в любом случае будет инициализировано до того как код дойдёт до until.

А разница какая?

Это насколько ж нерегулярный язык надо придумать, чтобы без внутреннего блока можно было, а с внутренним нельзя!

Ладно. Вот:

repeat
    goto haha;
    var x := 5;
haha:
until x=0;
begin
  begin
    var i := 5;
  end;
  writeln(i);
end.

То что это не компилируется - тоже значит “нерегулярно”?))

Так не честно! Вы использовали метки! Я ведь тоже так могу…

label l1;

begin
  goto l1;
  var i := 5;
  l1:
  Writeln(i);
end.

Ну а если серьёзно - метки особый случай. Они поддерживаются только для совместимости. Их должно читать из написанного ранее кода, но использовать их в новых программах - плохой тон, как и с глобальными переменными.

Да ну, бросьте - никакой это не плохой тон! Это только боязливые школьные учительницы не используют goto и школьников этому учат. И глобальные переменные тоже вполне нормальны, но в меру

1 лайк
Употребление слов из четырёх букв типа "go to" может иногда быть уместным даже
в самом лучшем обществе
             (Donald E. Knuth. "Structural Prigramming with go to Statement")

Беда лишь в том, что go to предполагает наличие метки, а некоторые господа, “имя которых слишком хорошо известно, чтобы его называть” (с) эти самые метки запретили в соединении с лямбдами. Причем строго запретили, даже если переходы делаются в области, где нет ни одной лямбды. Поэтому разговор о go to в PascalABC.NET - он на самом деле как бы такой… восхитительно бесполезный.

1 лайк

Спасибо за дельное пожелание. Я когда-то рассматривал такую возможность, но трудоёмкость даже чисто с точки зрения набивки получается большая. Это же не ради самого процесса делается. Смотрел ещё MPS но там Java, а где-то болтается С# в процессе развития. Вот seed7 ещё нашёл, но там меток конечно нет и переменные локальные по всему коду не разбрасываются, по крайней мере в дефолтной версии поставляемой по умолчанию. Да я наверное обойдусь старым стилем, как тут советовали. Даже сделал себе версию PascalABC.NET с подавленным предупреждением при использовании обычного for без всяких var-ов, то при компиляции программ переделанных с обычных Паскалей это предупреждение забивает все остальные.

Только эти “боязливые школьные учительницы” не знают ничего кроме глобальных переменных. Даже запись

Procedure Swap(Var a: Int32; Var b: Int32);
Begin
  Var Temp: Int32;
...

вызывает у них полное недоумение.

У меня тоже. В PascalABC.NET нет типа Int32.

2 лайка