Mientras que no está en BNF, EBNF tiene el excepto-símbolo (típicamente definido como "-"). En su caso, la sintaxis sería:
alphaNum="a"|"b"|...|"z"|"0"|"1"|...|"9"|"A"|...|"Z";
S= (alphaNum,{alphaNum}) - "foo";
O si usted quiere que sea sensible a mayúsculas:
foo="f"|"F","o"|"O","o"|"O";
alphaNum="a"|"b"|...|"z"|"0"|"1"|...|"9"|"A"|...|"Z";
S= (alphaNum,{alphaNum}) - foo;
Esto se traduce en un poco diferentes criterios de aceptación de lo que se hizo en los comentarios que serían equivalente a:
alphaNum="a"|"b"|...|"z"|"0"|"1"|...|"9";
S= alphaNum - "f", {alphaNum}
|"f", alphaNum - "o", {alphaNum}
|"f", "o", alphaNum - "o", {alphaNum};
Esto omite las cadenas "f" y "fo".
Sin embargo, es importante tener en cuenta que Ira Baxter tiene en su respuesta, lo que permite cualquier cosa como el factor exceptuado (negado) podría causar problemas. Esto también se señaló en el ISO standard:
4,7 excepción sintáctica
A sintáctico-excepción consiste en un factor sintáctica sujeto a la restricción de que las secuencias de símbolos representados por el sintáctico-excepción igualmente podría ser representado por un factor sintáctico que no contiene meta-identificadores.
NOTA - Si un sintáctico-excepción se permite ser un sintáctica factor arbitrario, extendido BNF podría definir una clase más amplia de idiomas de las gramáticas libres de contexto, incluyendo los intentos que conducen a Russell como paradojas, por ejemplo
xx = "A" - xx;
¿Es "A" un ejemplo de xx? Dicha licencia es indeseable y la forma de una excepción sintáctica está por lo tanto restringida a para casos que puedan probarse como seguros. Así, mientras que un factor sintáctico es en general equivalente a alguna gramática sin contexto , una excepción sintáctica siempre es equivalente a alguna gramática regular . Se puede demostrar que la diferencia entre una gramática libre de contexto y una gramática regular es siempre otra gramática sin contexto; de ahí que un término sintáctico (y por lo tanto cualquier gramática definida de acuerdo con este estándar) es equivalente a alguna gramática libre de contexto.
Creo que es posible definir esto de una manera muy complicada, construyendo la cadena usando caracteres individuales. – Jus12
Sí, eso puedes hacer. Preguntaste sobre la negación en general. Para su ejemplo específico, esta gramática hará el truco: S = notF any * | 'f' notO any * | 'f' 'o' notO any *; notF = 'a' | ... 'e' | 'g' | ... 'z'; notO = 'a' | ... | 'n' | 'p' | ... 'z'; any = 'a' | ... | 'z'; –