Gramática del Lenguaje de las Especificaciones Algebraicas.

            En la definición de la gramática se va a hacer uso de una serie de operadores que el usuario debe conocer para entenderlo correctamente:

             * implica que aquello que vaya dentro del paréntesis al que sucede se puede repetir 0 o más veces.

            + implica que aquello que vaya dentro del paréntesis al que sucede se puede repetir 1 o más veces.

            [] implica que aquello que sea encerrado en ellos es opcional, puede o no aparecer.

            | implica opcionalidad entre varias posibilidades.

            Se debe saber también que <ID> (identificador) es una cadena de caracteres que empiece por una letra, seguido de números, letras o “_” .

Definición de la gramática:

TIPO” <ID>

[“DOMINIOS” <ID>(“,”<ID>)*]

[“GENERICOS

              TIPO

<ID>

[“OPERACIONES

    ( funcion() [“PRECONDICIONES” precondiciones()])+

]

            | “FUNCION” funcion()

]

[“GENERADORES” (funcion())+]

[“CONSTRUCTORES” (funcion())+]

[“SELECTORES” (funcion())+]

[“AXILIARES” (funcion())+]

[“PRECONDICIONES” precondiciones()]

[“ECUACIONES” ecuaciones()]

funcion():            <ID> (“,”<ID>)*

:

[idToF()(“*”idToF())*]

(“->” | ”-/>”)

idToF()

precondiciones():             (decl_var())+  (precondicion())+

ecuaciones():                (decl_var())+   (regla())+

idToF():                       <ID> [“(“ lista_idToF() “)”]

lista_idToF():             idToF() (“,”IDToF())*

decl_var():                   <ID> (“,”<ID>)*  :” idToF()

precondicion():             termino() “:” termino()

regla():                         termino() “==” partederecha()

termino():                     <ID> [“(“ termino() (“,”termino())*”)”]

partederecha():             termino()

                                    | “SEA” lista_asignaciones() “EN” partederecha()

                                    | “SI” termino() “ENTONCES” partederecha()

[“SI NO” partederecha()]

lista_asignaciones(): (<ID> “=” termino())+