Esta sección contiene las firmas usadas por ML-Yacc-Yacc para las estructuras
en el archivo base.sml, functors y las estructuras que genera, y para las firmas
de las estructuras del lexer provistas por usted.
(* CORRIENTE: firma para una corriente perezosa. *) la CORRIENTE = los sig de la firma mecanografían ' una corriente val streamify: (unidad - > ' a) - > ' contra val de una corriente: ' a * ' una corriente - > ' una corriente val consigue: ' una corriente - > ' a * ' un extremo de la corriente (* LR_TABLE: firma para una tabla de LR. *) la firma pairlist del datatype de LR_TABLE = de los sig (' a, 'b) = VACIA|PAR de ' a * ' b * (' a, de 'b) estado del datatype del pairlist = ESTADO del término interno del datatype = de T de nonterm interno del datatype = de NT de la acción interna del datatype = de la CAMBIO del estado|REDUZCA de interno|ACEPTE|NumStates val de la tabla del tipo de ERROR: tabla - > numRules val internos: tabla - > describeActions val internos: tabla - > estado - > (término, acción) pairlist * describeGoto val de la acción: tabla - > estado - > (nonterm, estado) acción val del pairlist: tabla - > estado * término - > goto val de la acción: tabla - > estado * nonterm - > initialState val del estado: tabla - > excepción del estado goto de estado * mkLrTable val del nonterm: { acciones: ((término, acción) pairlist * acción) arsenal, gotos: (nonterm, estado) arsenal del pairlist, numStates: interno, numRules: interno, initialState: SÍMBOLO del estado } - > extremo de la tabla (*: firma para la estructura interna de un símbolo. *) SÍMBOLO de la firma = estructura LrTable de los sig: Símbolo del datatype de LR_TABLE (' a, 'b) = SÍMBOLO de LrTable.term * (' a * ' b * ' b) val sameToken: (' a, 'b) símbolo * (' a, 'b) símbolo - > extremo del bool (* LR_PARSER: firma para un programa de análisis polimórfico de LR *) la firma LR_PARSER = los sig estructura la corriente: Estructura LrTable de la CORRIENTE: Símbolo de la estructura de LR_TABLE: La excepción SIMBÓLICA ParseError de LrTable que comparte = de Token.LrTable val analiza: { tabla: LrTable.table, lexer: (' b, 'c) Token.token Stream.stream, arg: ' arg, saction: interno * ' c * (LrTable.state * (' b * ' c * ' c)) lista * ' arg - > LrTable.nonterm * (' b * ' c * ' c) * ((LrTable.state * (' b * ' c * ' c)) lista), vacío: ' b, EC: { is_keyword: LrTable.term - > bool, noShift: LrTable.term - > bool, preferred_subst:LrTable.term - > lista de LrTable.term, preferred_insert: LrTable.term - > bool, errtermvalue: LrTable.term - > ' b, showTerminal: LrTable.term - > secuencia, términos: Lista de LrTable.term, error: secuencia * ' c * ' c - > unidad }, lookahead: interno (* cantidad máxima de lookahead usada adentro * corrección de error *) } - > ' b * ((' b, 'c) Token.token Stream.stream) extremo
Lexers para el uso con la salida Ml-Yacc's debe emparejar una de estas
firmas.
la firma LEXER = los sig estructura UserDeclarations: los sig mecanografían (' a, 'b) el makeLexer val del tipo de la posición del tipo del extremo simbólico del svalue: (interno - > secuencia) - > unidad - > (UserDeclarations.svalue, UserDeclarations.pos) extremo de UserDeclarations.token (* ARG_LEXER: la opción de %arg de Ml-Lex permite que los usuarios produzcan los lexers que también toman una discusión antes de rendir una función de la unidad a un símbolo. *) la firma ARG_LEXER = los sig estructura UserDeclarations: los sig mecanografían (' a, 'b) el makeLexer val del tipo de la posición del tipo del svalue del tipo del extremo simbólico del arg: (interno - > secuencia) - > UserDeclarations.arg - > unidad - > (UserDeclarations.svalue, UserDeclarations.pos) extremo de UserDeclarations.token
La firma siguiente se utiliza en las firmas generadas por ML-Yacc-Yacc:
(* PARSER_DATA: la firma de las estructuras de ParserData adentro { el functor del n}LrValsFun produjo por ML-Yacc-Yacc. Todas tales estructuras emparejan esta firma. *) la firma PARSER_DATA = los sig mecanografía el arg del tipo del svalue del tipo de la posición (* el tipo de línea numera *) (* el tipo de valores semánticos *) (* el tipo del user-supplied *) (* discusión al programa de análisis *) estructura LrTable del resultado del tipo: Símbolo de la estructura de LR_TABLE: SÍMBOLO que comparte acciones de la estructura de Token.LrTable = de LrTable: acciones val de los sig: * posición * (LrTable.state * (svalue * posición * posición)) lista * arg - > LrTable.nonterm * (svalue * posición * posición) * ((LrTable.state * (svalue * posición * posición)) vacío val interno de la lista): extracto val del svalue: el svalue - > EC de la estructura del extremo del resultado (* EC de la estructura contiene la información usada para mejorar la recuperación de error en un programa de análisis error-correcting *): is_keyword val de los sig: LrTable.term - > noShift val del bool: LrTable.term - > preferred_subst val del bool: LrTable.term - > preferred_insert val de la lista de LrTable.term: LrTable.term - > errtermvalue val del bool: LrTable.term - > showTerminal val del svalue: LrTable.term - > términos val de la secuencia: Tabla val del extremo de la lista de LrTable.term (* la tabla es la tabla de LR para el programa de análisis *): Extremo de LrTable.table
Ml-Yacc genera estas dos firmas:
(* impreso en el archivo del sig creado por el generador del programa de análisis: *) firma { los n}_TOKENS = los sig mecanografían (' a, 'b) la firma simbólica del extremo del svalue del tipo... { los n}_LRVALS = los sig estructuran símbolo: { estructura ParserData de los n}_TOKENS: PARSER_DATA que comparte el tipo ParserData.Token.token = Tokens.token que comparte el tipo extremo de ParserData.svalue = de Tokens.svalue
Los programas de análisis creados aplicando el functor del unido emparejarán esta firma:
el PROGRAMA DE ANÁLISIS = los sig de la firma estructuran el símbolo: Corriente SIMBÓLICA de la estructura: MakeLexer val del svalue del tipo del arg del tipo del resultado del tipo de la posición del tipo de ParseError de la excepción de la CORRIENTE (* la posición es el tipo de números de la línea *) (* valor vuelto por el programa de análisis *) (* tipo de la discusión user-supplied *) (* los tipos de valores semánticos *): (interno - > secuencia) - > (svalue, posición) Token.token Stream.stream val analizan: interno * ((svalue, posición) Token.token Stream.stream) * (secuencia * posición * posición - > unidad) * arg - > resultado * (svalue, posición) Token.token Stream.stream val sameToken: (svalue, posición) Token.token * (svalue, posición) Token.token - > extremo del bool
Los programas de análisis creados aplicando el functor de JoinWithArg emparejarán esta firma:
la firma ARG_PARSER = los sig estructura el símbolo: Corriente SIMBÓLICA de la estructura: MakeLexer val del svalue del tipo del resultado del tipo de la posición del tipo del lexarg del tipo del arg del tipo de ParseError de la excepción de la CORRIENTE: (interno - > secuencia) - > lexarg - > (svalue, posición) Token.token Stream.stream val analizan: interno * ((svalue, posición) Token.token Stream.stream) * (secuencia * posición * posición - > unidad) * arg - > resultado * (svalue, posición) Token.token Stream.stream val sameToken: (svalue, posición) Token.token * (svalue, posición) Token.token - > extremo del bool