Как работать с большими алфавитами в BNF? - PullRequest
0 голосов
/ 03 августа 2020

Для языка, определенного как:

Любая пара совпадающих символов является допустимой строкой.

Например, 00, 55, qq, YY

И большой алфавит из нетерминальных символов (скажем, 4,294,967,296 из них) ...

Как бы вы определили грамматику BNF для express языка? (С учетом контекста или иначе.)

Меня особенно интересует, есть ли способ сделать это без написания 4,294,967,296 правил: то есть грамматика настолько велика, что теряет все преимущества определения с помощью BNF, поскольку она стала «грубой силой» "набор допустимых литералов.

1 Ответ

1 голос
/ 03 августа 2020

В большинстве случаев BNF используется для описания контекстно-свободных грамматик.

Вы, конечно, можете использовать нотацию BNF для неконтекстно-независимой грамматики; все, что вам нужно сделать, это разместить более одного терминала с левой стороны. Однако, как правило, это не очень полезно на практике, потому что неконтекстные грамматики не обеспечивают интуитивного описания структуры анализируемого языка и не приводят к алгоритму синтаксического анализа языка. И можно было бы ожидать, что любой практический грамматический формализм либо даст читателям хорошее описание, либо позволит автоматическое создание синтаксического анализатора, либо и то, и другое. (Это не делает неконтекстно-свободные грамматики бесполезными при формальном анализе языков; в математической теории нет необходимости радовать читателя или генератор синтаксического анализатора.)

Но если мы ограничим к контекстно-свободным грамматикам, мы сразу же попадаем в затруднительное положение, потому что контекстно-свободная грамматика не может express дублировать, например {ωω | ω∈Σ *}. Дублирование почти по определению не является бесконтекстным, потому что контекстно-свободное расширение означает, что расширение нетерминала не может зависеть от контекста, в котором появляется нетерминал. Следовательно, правило, которое гласит, что «этот нетерминал должен иметь такое же расширение, что и этот нетерминал», что требуется для express дублирования, не может быть контекстно-свободным.

Конечно, язык { ωω | ω∈Σ}, которое вы хотите описать, является контекстно-независимым, но это только потому, что можно перечислить все возможности (которые должны быть конечным числом, потому что мы настаиваем, что (алфавит Σ - конечное множество).

Так что же тогда вам остается?

По сути, вы можете изобретать любой формализм, соответствующий вашим целям, если вы четко определяете его значение для читатель. Этот формализм может привести или не привести к возможности автоматического создания парсера, но если это не ваша цель, этот факт не имеет значения. Большинство диалектов EBNF - а их очень много, практически ни один из которых не может сгенерировать синтаксический анализатор без посторонней помощи - позволяют каким-то образом встраивать описания, написанные на естественном языке, для синтаксисов, которые сложно или невозможно описать бесконтекстным методом. грамматика. Если вы просмотрите примеры EBNF, вы, вероятно, найдете большое количество различных способов сказать «это любой элемент набора символов» без фактического полного перечисления всего набора символов, что с учетом существования Unicode было бы нелепым делом. (Хотя Unicode имеет только 17 * 2 16 кодовых точек, что намного меньше, чем 2 32 . Но все равно больше миллиона.)

...