Стандартные (правильные) регулярные грамматики имеют три типа правил:
A <- ""
A <- "a"
A <- "a" B
Это нормально с теоретической точки зрения, но создает большие неудобства для практического использования. Практичная регулярная грамматика должна позволять нам использовать товарные операторы (|
,*
,+
,?
,.
,(
,)
), наборы символов и группировать несколько правил в одно. Например, следующая регулярная грамматика описывает дробные числа:
start <- digit+ dot digit* | digit* dot digit+
digit <- [0-9]
dot <- '.'
Вопрос в том, какие ограничения должны применяться к нетерминалам RHS, чтобы эти грамматики оставались регулярными (если это вообще возможно)?
ПРИМЕЧАНИЕ
В. Почему обычные грамматики вместо регулярных выражений?
О. Регулярные выражения подходят для простых языков, но для более сложных они доступны только для записи. С другой стороны, хорошо написанные расширенные регулярные грамматики более удобочитаемы и удобны в сопровождении и позволяют нам легко расширять их с помощью захватов и правил.