zu www.bildungsgueter.de zur Inhaltsübersicht des Kapitels

Der Compiler MARST

Bekannte Fehler


Bekannte Besonderheiten und Fehler:

Laufanweisung (Besonderheit)

Nicht definitionskonforme Implementierung des step-until-elements der Laufanweisung. Die implementierung entspricht weder den Vorgabendes Revised Report noch jenen des Modified Report.

Verteiler, der einen Namensparameter verwendet (Fehler)

Für in Verteilern aufgeführte Marken werden zu strenge Sichtbarkeitsregeln implementiert, die zulässige Sprünge in compound statements verhindern.


Bei Verteilern wurde ein Problem bemerkt, wenn der Index des Verteilers ein durch Namensaufruf übergebener formaler Parameter ist.

begin
  comment
   *  When compiled with the MARST Algol-to-C Translator, Version 2.7,
   *  this program terminates with a memory access error when the
   *  switch index is computed in procedure execSwitch.
   ;

  procedure execSwitch(idx);
    integer idx;
  begin
    switch sw := label1, label2;

    goto sw[idx];     comment  ERROR OCCURS HERE  ;
    label1:  outstring(1, "Case 1\n");
             goto exit proc;
    label2:  outstring(1, "Case 2\n"); 
    exit proc:
  end  execSwitch;

  execSwitch(1);
  execSwitch(2)
end

Bei der Ausführung der Anweisung

goto sw[idx]; 

tritt ein Speicherzugriffsfehler auf.

Die folgende Variante des Programms funktioniert:

begin

  procedure execSwitch(idx);
    integer idx;
  begin
    switch sw := label1, label2;
    integer d;

    d := idx;
    goto sw[d];
    
    label1:  outstring(1, "Case 1\n");
             goto exit proc;
    label2:  outstring(1, "Case 2\n"); 
    exit proc:
  end  execSwitch;

  execSwitch(1);
  execSwitch(2)
end

Der gleiche Fehler kann auch mit einem ähnlichen Beispielprogramm demonstriert werden, in dem der Index des Verteilers durch eine als Parameter bereitgestellte Funktionsprozedur berechnet wird:

begin
  comment
   *  When compiled with the MARST Algol-to-C Translator, Version 2.7, 
   *  this program terminates with a memory access error when the
   *  switch index is computed in procedure execSwitch.
   ;

  procedure execSwitch(idx);
    integer procedure idx;
  begin
    switch sw := label1, label2;

    goto sw[idx];     comment  ERROR OCCURS HERE  ;
    label1:  outstring(1, "Case 1\n");
             goto exit proc;
    label2:  outstring(1, "Case 2\n"); 
    exit proc:
  end  execSwitch;

  integer procedure idx1;
    idx1 := 1;

  integer procedure idx2;
    idx2 := 2;

  execSwitch(idx1);
  execSwitch(idx2)
end

Auch hier kann durch Zwichenspeicherung des Indexwerts eine funktionsfähige Version hergestellt werden:

begin

  procedure execSwitch(idx);                                           
    integer procedure idx;
  begin
    switch sw := label1, label2;
    integer d;
    d := idx;

    goto sw[d];
    label1:  outstring(1, "Case 1\n");
             goto exit proc;
    label2:  outstring(1, "Case 2\n"); 
    exit proc:
  end  execSwitch;

  integer procedure idx1;
    idx1 := 1;

  integer procedure idx2;
    idx2 := 2;

  execSwitch(idx1);
  execSwitch(idx2)
end

Fehleranalyse

Die Compilierung des Switch geschieht in der Prozedur switch_designator in marst.c. Diese Prozedur beginnt in Zeile 1534. In den Zeilen 1579 bis 1582 wird der Fall des lokal vereinbarten Verteilers behandelt. Dort fehlt wohl die Behandlung des Falls, dass der Indexausdruck ein call-by-name-Parameter ist. In Zeile 2505 in Prozedur primary steht die Compilierung eines mit call-by-nme bereitgestellten Integerwerts.


zur Inhaltsübersicht des Kapitels