2012-06-06 17 views
8

BNF o ABNF son compatibles con la negación. Eso es excluir a ciertos miembros del conjunto? No vi ningún operador de negación en su sintaxis.¿Cómo representar la negación en BNF?

Por ejemplo, supongamos que S es el conjunto de todas las cadenas alfanuméricas que son no es igual-"foo" ¿Cuál es el BNF para S?

+0

Creo que es posible definir esto de una manera muy complicada, construyendo la cadena usando caracteres individuales. – Jus12

+1

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'; –

Respuesta

3

Las gramáticas libres de contexto no se cierran bajo "diferencia" o "complementos". Entonces, si bien puede decidir agregar un operador "restar" a su BNF, el resultado no será una gramática sin contexto, incluso si tiene una forma simple de expresarlo. Consecuencia: las personas no permiten que los operadores en las gramáticas BNF se utilizan para expresar gramáticas libres de contexto.

+2

Entonces, ¿cómo comprueban los compiladores que las variables no son palabras reservadas? – Jus12

+4

El reconocimiento de palabras clave normalmente se realiza en el lector de textos, no en el analizador. Un lexer normalmente solo * ordena * las comparaciones, por lo que primero busca las palabras clave. Si y solo si eso falla, tiene algún otro identificador. –

+0

Los esquemas más sofisticados tratan los identificadores como palabras clave en el contexto en el que pueden tratarse como palabras clave. Esto requiere que el analizador y el analizador interactúen para hacer la elección, y/o el analizador para probar alternativas de palabras clave e identificadores, y elija la alternativa de palabra clave si funciona. Hacemos esto con nuestros analizadores sintácticos y funciona bastante bien. –

2

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.

Cuestiones relacionadas