);
Blank;
Terminal (term);
tmp.Name: = '<' + term + '>';
If (SearchInBlock (y, LTN, tmp) = 0) and (term>'') Then
Complete (LTN, tmp); {додаємо лівий}
Blank;
inc (i);
End
Else
Begin
Terminal (term);
tmp.Name: = term;
If (SearchInBlock (y, LTN, tmp) = 0) and (term>'') Then
Complete (LTN, tmp); {додаємо лівий}
If (i-1) = Len Then {після: = або після | тільки один термінал}
Complete (RTN, tmp);
End;
If i> Len Then Goto Next; {останній у рядку був термінал}
While (i '|') Do inc (i); {остаточно правил}
If s [i] = '>' Then {останній у правилі нетермінал}
Begin
While (I> 1) and (s [i] <> '<') Do dec (i);
inc (i);
Blank;
Terminal (term); {останній нетермінал}
tmp.Name: = '<' + term + '>';
If (SearchInBlock (y, RTN, tmp) = 0) and (term>'') Then
Complete (RTN, tmp); {додаємо правий}
inc (i); {пропуск>}
If s [i] = '|' Then
Begin
inc (i);
Goto More;
End;
End
Else {останній у правилі термінал}
Begin
While (I> 1) and not ((s [i] = '') or (s [i] = '|') or (s [i] = '>')) Do dec (i);
inc (i);
Blank;
Terminal (term);
tmp.Name: = term;
If (SearchInBlock (y, RTN, tmp) = 0) and (term>'') Then
Complete (RTN, tmp); {додаємо правий}
If s [i] = '|' Then
Begin
inc (i);
Goto More;
End;
End;
If i
Goto More;
next: inc (y);
tmp.Name: = # 0; {після кожного рядка ставимо роздільник}
Complete (LTN, tmp); {додаємо лівий}
Complete (RTN, tmp); {додаємо правий}
Until y> CLine;
{після циклу отримали "Попередні" ліві і праві, їх ще треба доповнити}
For y: = 1 To 10 Do
Begin
Add_ (LTn);
Add_ (RTn);
End;
{отримали ліві і праві, розділені # 0}
End;
Procedure Matrix;
Procedure Precede;
Label More, Next;
Var mi, mj: Byte;
tmp: List;
p: NotTerm;
term, term2: String;
Ex: Boolean;
Begin
y: = 1;
i: = 1;
Repeat
PosStr (y, s);
Blank;
i: = Pos ("=", S) +1; {i ставимо після: =}
More: Blank;
If s [i] = '<' Then
Begin
inc (i);
Blank;
Terminal (term);
tmp.Name: = '<' + term + '>';
term2: = tmp.Name;
Blank;
inc (i);
mi: = Search (Trm_notTrm, tmp);
If Terminal (term) Then {нетермінал з...