or Dig (S [i], n) do
Begin
If (i-j) <9 Then term: = term + S [i];
inc (i);
End;
If (i-j)> 8 Then
Ex: = False
Else
Blank;
End
Else
Ex: = False
Else
Ex: = False;
notTerminal: = Ex;
End;
{}
Procedure Check;
Var term: String;
Exist, Ex: Boolean;
notT: List;
k: Byte;
Label notTerminalOrTerminal,
OrS, LineS, EndS, Start, New, Gluk;
Begin
Goto Start;
New: {при виникненні помилки}
DeleteList (NotTerminalS);
DeleteList (NotTerminalL);
DeleteList (Trm_NotTrm);
If not InputText Then Exit;
Start: {один раз}
i: = 1;
y: = 1;
k: = 1;
CTerm: = 0;
CTrmNotTrm: = 0;
PosStr (1, s); {перша рядок}
If s ='' Then
Goto New;
LineS: {нова рядок}
GotoXY (1,10); Write (s + 'Довжина аналіз.строкі', Length (s), '' + # 13 # 10, 'y =', y, ' всього рядків ', Cline);
Blank;
If not (S [i] = '<') Then
Begin
Error (1);
Goto New;
End
Else
Begin
inc (i);
Blank;
If not notTerminal (term) Then
Begin
Error (4);
Goto New;
End
Else
Begin {є нетермінал}
Blank;
If not (S [i] = '>') Then
Begin
Error (2);
Goto New;
End
Else {записуємо нетермінал}
Begin
NotT.Name: = '<' + term + '>';
If Search (NotTerminalL, NotT)> 0 Then
Begin {многоопределенний}
Error (9);
Goto New;
End;
If Search (Trm_NotTrm, NotT) = 0 Then
Begin
Complete (Trm_NotTrm, NotT); {до загального списку теміналі & нетерміналов}
inc (CTrmNotTrm);
End;
Complete (NotTerminalL, NotT); {лев. частина}
inc (CTerm);
inc (i);
Blank;
If not (Copy (s, i, 2) = ': =') Then
Begin
Error (3);
Goto New;
End
Else
Begin {є: =}
inc (i, 2);
notTerminalOrTerminal: {після : = Обов'язковий термінал або нетермінал}
Blank;
If s [i] = '<' Then {нетермінал}
Begin
inc (i);
Blank;
If notTerminal (term) Then
Begin {є нетермінал}
Blank;
If s [i] = '>' Then {записуємо нетермінал}
Begin
NotT.Name: = '<' + term + '>';
Complete (NotTerminalS, NotT);
If Search (Trm_NotTrm, NotT) = 0 Then
Begin
Complete (Trm_NotTrm, NotT); {в загальний список теміналі & нетерміналов}
inc (CTrmNotTrm);
End;
inc (i);
...