<b>procedure</b> Komentarze(wej,wyj:string);
<b>type</b> stany=(nic,kom1,naw_otw,kom2,kom2_gw,napis);
<b>var</b> f,g:Text;
stan:stany;
c:character;
<b>begin</b>
assign(f,wej);
assign(g,wyj);
reset(f);
rewrite(g);
stan:=nic;
<b>while</b> <b>not</b> eof(f) <b>do</b> <b>begin</b>
<b>if</b> <b>not</b> eoln(f) <b>then</b>
read(f,c);
<b>case</b> stan <b>of</b>
nic:
<b>case</b> c <b>of</b>
'(': stan:=naw_otw;
'''': <b>begin</b> stan:=napis; write(g,c) <b>end</b>;
<b>else</b> write(g,c);
<b>end</b>
naw_otw:
<b>case</b> c <b>of</b>
'*': stan:=kom2;
'''': <b>begin</b> stan:=napis; write(g,'('''); <b>end</b>;
'{': <b>begin</b> stan:=kom1; write(g,'({'); <b>end</b>
<b>else</b> <b>begin</b> stan:=nic; write(g,'(',c); <b>end</b>
<b>end</b>
kom2:
<b>case</b> c <b>of</b>
'*': stan:=kom2_gw;
<b>end</b>
kom2_gw:
<b>case</b> c <b>of</b>
')': stan:=nic;
'*': stan:=kom2_gw;
<b>else</b> stan:=kom2
<b>end</b>
kom1:
<b>case</b> c <b>of</b>
'}': stan:=nic
<b>end</b>
napis:
<b>case</b> c <b>of</b>
'''': <b>begin</b> stan:=nic; write(g,c); <b>end</b>
<b>else</b> write(g,c);
<b>end</b>
<b>end</b>
<b>end</b>
<b>else</b> <b>begin</b> // eoln(f) readln(f);
<b>case</b> stan <b>of</b>
nic: writeln(g);
naw_otw: <b>begin</b> stan:=nic; writeln(g,'('); <b>end</b>;
kom2: // nic
kom2_gw: stan:=kom2;
kom1: // nic
napis: writeln(g)
<b>end</b>
<b>end</b>
<b>end</b>
close(f);
close(g);
<b>end</b>
Każdy obrót pętli while w powyższej procedurze przetwarza jedno zdarzenie (znak lub koniec wiersza) z pliku wejściowego. W zależności od stanu i znaku (zdarzenia) zmieniany jest odpowiednio stan i zapisywany odpowiedni napis do pliku wyjściowego.
Można sobie wyobrazić zawartość pętli while w powyższej procedurze jako dwuwymiarową tabelkę, której kolumny indeksowane są stanami, wiersze - rodzajem zdarzenia wejściowego, a w każdej komórce jest informacja, jaki ma być nowy stan i co wypisać do pliku g.