Votre original EBNF n'est pas récursive dans <S>
, mais votre période d'essai est BNF. Si vous voulez que la BNF génère le même langage, vous ne devriez pas le faire. En outre, votre EBNF ne peut pas générer epsilon
, vous ne devez donc pas l'ajouter à votre production <S>
.
Comme autre réponse dit, vous devez introduire non-terminaux supplémentaires:
<S> -> <plusminus> <optionalC> <repeatedA>
<plusminus> -> + | -
<optionalC> -> <C> | epsilon
<repeatedA> -> <A> <repeatedA> | epsilon
Ceci est une traduction directe des éléments EBNF dans votre grammaire originale. Même si vous avez des exigences supplémentaires (comme l'élimination d'epsilon), vous devriez commencer par ce genre d'étape.
Notez que la règle <S>
n'est pas récursive. En outre, bien que epsilon
soit utilisé pour certains non-terminaux supplémentaires, il ne fait pas partie des règles <S>
ou <plusminus>
, de sorte que, comme dans l'original EBNF, <S>
ne peut pas le produire.
Votre question n'est pas claire. * Qu'est-ce que * (re?) Peut produire * C * et pourquoi est-ce mauvais? Ce serait vraiment utile si vous montriez les étapes par lesquelles vous avez produit la réponse que vous avez obtenue et la justification de chaque étape. –