Статья ANTLR была неверна в отношении PEG.
LL (*) является подмножеством DCFG (детерминированной контекстной свободной грамматики), которая является подмножеством CFG (Context Free Grammar).
PEG может выражать контекстно-зависимые грамматики, такие как A{n}B{n}C{n}
, в которых A
и B
и C
все встречаются n
раз.Вот определение:
s := &(x C) A+ y / ε
x := A x B / A B
y := B y C / B C
Но нет способа определить такую грамматику в CFG (доказательство включает в себя лемму насоса).Таким образом, PEG не является подмножеством CFG.Является ли ПЭГ надмножеством CFG?Я не знаю.
Два ключевых различия между LL (*) и PEG:
LL (*) могут только смотреть на паттерн DFA, тогда как PEG может смотреть впередрекурсивный паттерн.Например, в PEG вы можете посмотреть вложенные парены, в то время как LL (*) не может.
Оператор выбора /
в PEG - это приоритетный выбор (или «притяжательный»), которыйозначает, что если у вас есть правило A / AB
, оно никогда не достигнет правой стороны AB
.В LL (*) для правила A | AB
можно сопоставить AB
.
Если у вас есть грамматика PEG без прогнозирования, или ваш шаблон прогнозирования может быть уменьшенв DFA, затем он может быть переведен в LL (*).Если нет, то это невозможно.