177
правок
Изменения
→Идея алгоритма
Пусть, <tex> P = \{N_1,N_2,...,N_K\} </tex> разбиение <tex> N^*</tex> на <tex> k </tex> дизъюнктных множеств взаимно рекурсивных терминалов,
<tex> N_1 \cup N_2 \cup ... \cup N_k = N^* \land \forall i N_i \neq \emptyset </tex>.
'''function''' IsLeftTypeisLeftType(<tex>N_i</tex>)
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \alpha \neq \varepsilon ]</tex>
'''function''' IsRightTypeisRightType(<tex>N_i</tex>)
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \beta \neq \varepsilon ]</tex>
Введем функцию <tex> getTheTypeOfMutualRecursiveSet(N_i): P \rightarrow \{left, right, self, cycle\} </tex>:
'''function''' getTheTypeOfMutualRecursiveSet (<tex>N_i</tex>):
'''if''' !IsLeftTypeisLeftType(<tex>N_i</tex>) && IsRightTypeisRightType(<tex>N_i</tex>)
return left;
'''if''' IsLeftTypeisLeftType(<tex>N_i</tex>) && !IsRightTypeisRightType(<tex>N_i</tex>)
return right;
'''if''' (IsLeftTypeisLeftType(<tex>N_i</tex>) && IsRightTypeisRightType(<tex>N_i</tex>)
return self;
'''if''' !IsLeftTypeisLeftType(<tex>N_i</tex>) && !IsRightTypeisRightType(<tex>N_i</tex>)
return cyclic;
Заметим, что <tex> \forall i </tex> <tex>getTheTypeOfMutualRecursiveSet(N_i) \neq self </tex>, т.к в противном случае грамматика будет самоприменима.<br \>