Грамматика регулярна, если она либо праволинейна, либо леволинейна. В этом руководстве утверждается, что из-за этого он обладает особым свойством:
Регулярная грамматика обладает особым свойством: заменяя каждый нетерминал (кроме корневого) его правой частью, вы можете свести ее к единственной продукции для корня, с только терминалами и операторами в правой части... Сокращенное выражение терминалов и операторов можно записать в еще более компактной форме, называемой регулярным выражением.
Поэтому я решил проверить эту идею и преобразовать обычный грамматику EcmaScript для IdentifierName в регулярные выражения:
IdentifierName ::
IdentifierStart
IdentifierName IdentifierPart
Предположим, что IdentifierStart
и IdentifierPart
ограничены следующим:
IdentifierStart :: IdentifierPart ::
A A
B C
C &
$
_
Но я не уверен, как поступить, поскольку грамматика для IdentifierName
имеет как рекурсию, так и чередование. Любая помощь?
Меня больше интересует подход, а не поиск результирующего регулярного выражения, которое, как показал @Bergi, равно [ABC$_][AC&]*
.