Una especificación Ml-Yacc consiste en tres porciones, cada uno de las cuales es separada de las otras por un delimitador del %%. El formato general es:
{ declaraciones del usuario }
%%
{ declaraciones Ml-Yacc }
%%
{ reglas }
Usted puede definir los valores disponibles en las acciones semánticas de las
reglas en la sección de los declaraciones del usuario. Se recomienda que usted
mantiene el tamaño de esta sección tan pequeño como sea posible bloques grandes
y del lugar del código otros módulos.
La sección de los declaraciones Ml-Yacc se utiliza para hacer un sistema de
declaraciones requeridos y un sistema de declaraciones opcionales. Usted debe
declarar los nonterminals y los terminales y los tipos de los valores asociados
a ellos allí. Usted debe también nombrar el programa de análisis y declarar el
tipo de valores de la posición. Usted debe especificar el sistema de los
terminales que pueden seguir el símbolo de inicio y el sistema de terminales
non-shiftable. Usted puede declarar opcionalmente los precedences para los
terminales, hace los declaraciones que mejorarán la error-recuperacio'n, y
suprime la generación de las reducciones del defecto en el programa de análisis.
Usted puede declarar si el generador del programa de análisis debe crear una
descripción prolija del programa de análisis en un archivo del '' de ``.desc.
Esto es útil para encontrar las causas de los errores de shift/reduce y el otro
análisis está en conflicto.
Usted puede también declarar si las acciones semánticas están libres de efectos
secundarios significativos y terminar siempre. Normalmente, Ml-Yacc retrasa la
evaluación de acciones semánticas hasta que la terminación de un acertado
analiza. Esto se asegura de que no haya acciones semánticas al `` deshaga el ''
si un error-correction sintáctico invalida algunas acciones semánticas. Si, sin
embargo, las acciones semánticas están libres de efectos secundarios
significativos y terminan siempre, los resultados de las acciones semánticas que
son invalidadas por una lata error-correction sintáctica se no hagan caso
siempre con seguridad.
Los programas de análisis funcionan más rápidamente y necesitan menos memoria
cuando no es necesario a retrasa la evaluación de acciones semánticas. A le
animan que escriba las acciones semánticas que están libres de efectos
secundarios y siempre termine y declare esta información a Ml-Yacc.
Una acción semántica está libre de efectos secundarios significativos si puede
ser ejecutado nuevamente un número razonablemente pequeño de épocas sin afectar
el resultado de un análisis. (el reexecution ocurre cuando el programa de
análisis error-correcting está probando correcciones posibles para fijar un
error del sintaxis, y el número de épocas que ocurre el reexecution es limitado
áspero, para cada error del sintaxis, por el número de los tiempos de los
terminales la cantidad de lookahead permitió para el programa de análisis error-correcting).
La sección de las reglas contiene las producciones de la gramática independiente
del contexto y sus acciones semánticas asociadas.
Los comentarios tienen la misma definición léxica que hacen en el ml estándar
y pueden para ser puestos dondequiera en una especificación.
Todos los caracteres hasta la primera ocurrencia de un exterior del %% que
delimita de un comentario se ponen en la sección de los declaraciones del
usuario. Después de ésa, las palabras y los símbolos siguientes son reservados:
de para = { }, * - >:|()
Las clases siguientes de los símbolos del ml se utilizan:
- identificadores:
- los identificadores nonsymbolic del ml, que consisten en un carácter alfabético siguieron por unos o más caracteres alfabéticos, caracteres numéricos, preparan '' del `` ', o subrayan el `` _ ' '.
- variables del tipo:
- identificador nonsymbolic del ml comenzando con '' de un `` primero '
- números enteros:
- unos o más dígitos decimales.
- identificadores cualificados:
- un identifer siguió por un período.
Las clases siguientes de los símbolos no-Ml se utilizan:
- %es de los identificadores:
- una muestra de los por ciento siguió por unas o más letras minúsculas del alfabeto. Los %es válidos de los identificadores son:
%arg %eop %header %keyword %left %name %nodefault %nonassoc %nonterm %noshift %pos %prec %prefer %pure %right %start %subst %term %value %verbose- código:
- Esta clase se significa para llevar a cabo código del ml. El código del ml no se analiza para los errores del sintaxis. Consiste en paréntesis izquierdos seguidos por todos los caracteres hasta paréntesis derechos que balancean. Paréntesis en comentarios del ml y las secuencias del ml se excluyen de la cuenta de paréntesis que balancean.
Ésta es la gramática para las especificaciones:
| espec. | ::= | regla-lista de la cmd-lista el %% de los usuario-declaraciones el %% |
| Ml-tipo | ::= | tipos nonpolymorphic del ml (véase el manual estándar del ml) |
| símbolo | ::= | identificador |
| si'mbolo-lista | ::= | símbolo de la si'mbolo-lista |
| | | e | |
| si'mbolo-tipo-lista | ::= | si'mbolo-tipo-lista | símbolo del Ml-tipo |
| | | lista del si'mbolo-tipo | símbolo | |
| | | símbolo del Ml-tipo | |
| | | símbolo | |
| subst-lista | ::= | subst-lista | símbolo para el símbolo |
| | | e | |
| cmd | ::= | %arg (Cualquier-Ml-patro'n) : Ml-tipo |
| | | si'mbolo-lista de %eop | |
| | | código de %header | |
| | | si'mbolo-lista de %keyword | |
| | | si'mbolo-lista de %left | |
| | | identificador de %name | |
| | | %nodefault | |
| | | si'mbolo-lista de %nonassoc | |
| | | lista del si'mbolo-tipo de %nonterm | |
| | | si'mbolo-lista de %noshift | |
| | | Ml-tipo de %pos | |
| | | si'mbolo-lista de %prefer | |
| | | %pure | |
| | | si'mbolo-lista de %right | |
| | | símbolo de %start | |
| | | subst-lista de %subst | |
| | | si'mbolo-tipo-lista de %term | |
| | | código del símbolo de %value | |
| | | %verbose | |
| cmd-lista | ::= | cmd de la cmd-lista |
| | | cmd | |
| regla-prec | ::= | símbolo de %prec |
| | | e | |
| cla'usula-lista | ::= | código de la regla-prec de la si'mbolo-lista |
| | | cla'usula-lista | código de la regla-prec de la si'mbolo-lista | |
| regla | ::= | símbolo : cla'usula-lista |
| regla-lista | ::= | regla de la regla-lista |
| | | regla |