Мне нужно написать функцию, которая проверяет, допустимы ли входные строки для данной спецификации языка. Я думал, что это будет стандартная CFG -> Нормальная форма Хомского, затем синтаксический анализ CYK, но одно из правил языка предотвращает это.
Некоторые правила просты: если мы определим терминалы {a,b,c,d,e,f,P,Q,R,S}
, то допустимые строки будут
1) Любой из терминалов в нижнем регистре изолированно
2) Если 'x' - допустимая строка, то Sx тоже.
Но третье правило
3) Если X и Y - допустимые входные строки, то PXY, QXY, RXY тоже.
где {P,Q,R}
- остальные терминалы в верхнем регистре, а X и Y - нетерминалы.
Как будет выглядеть производственное правило для этого? Я думал, это будет что-то вроде
XY -> PXY (and QXY, RXY)
но с этим есть две проблемы. Во-первых, это не правило CFG - означает ли это, что вместо этого этот язык определяет CSG?
Во-вторых, это не работает, потому что
XY -> PXY -> PPXY
не во всех случаях будет правильным сообщением.