Creando el Programa de Análisis

 

    Deje el nombre del archivo de la especificación de la gramática ser cerca denotada { gramática } y el nombre del archivo de la especificación del lexer se denote por { lexer } (e.g. en nuestro ejemplo de la calculadora que éstos estarían parados para calc.grm y calc.lex, respectivamente). Deje el nombre del programa de análisis en la especificación ser representado por { n } (e.g. Calc en nuestro ejemplo de la calculadora).

Para construir un programa de análisis, haga el siguiente:

  1. En el archivo apropiado de la descripción del CM (e.g. para su programa o principal de sus subgrupos o bibliotecas), incluya las líneas:
      ml-yacc-lib.cm { lexer } { gramática } 

    Esto hará Ml-Yacc ser funcionada encendido { gramática }, produciendo archivos de fuente { grammar}.sig y { grammar}.sml, y Ml-Lex que se funcionará encendido { lexer }, produciendo un archivo de fuente { lexer}.sml. Entonces estos archivos serán compilados después de cargar las firmas y los módulos necesarios de la biblioteca Ml-Yacc según lo especificado por ml-yacc-lib.cm .

  2. Aplique los functors para crear el programa de análisis:
      estructure { n}LrVals = { símbolo del n}LrValsFun(structure = LrParser.Token) estructura { n}Lex = { símbolo del n}LexFun(structure = { n}LrVals.Tokens) estructura { n}Parser = Join(structure ParserData = { estructura LrParser=LrParser de Lex={n}Lex de la estructura de n}LrVals.ParserData) 

    Si el lexer fue creado usando el declaración de %arg en Ml-Lex, la definición de { el n}Parser se debe cambiar para utilizar otro functor llamado JoinWithArg:

      estructura { n}Parser = JoinWithArg (estructura LrParser=LrParser de Lex={n}Lex de la estructura de la estructura ParserData={n}LrVals.ParserData) 

El contorno siguiente resume este proceso:

  (* en la parte superior nivel disponible *) estructura SIMBÓLICA LrParser de la CORRIENTE LR_PARSER PARSER_DATA de LR_TABLE:  LR_PARSER (* impreso en el archivo del sig creado por el generador del programa de análisis:  *) firma { n}_TOKENS = símbolo de la estructura de los sig:  Svalue SIMBÓLICO del tipo val MÁS:  ' posición * ' posición - > (svalue, 'pos) Token.token INTLIT val:  * ' posición * ' posición interna - > (svalue, 'pos) firma del extremo de Token.token... { n}_LRVALS = símbolo de la estructura de los sig:  { estructura ParserData de los n}_TOKENS:  PARSER_DATA que comparte ParserData.Token = Tokens.Token que comparte el tipo extremo de ParserData.svalue = de Tokens.svalue (* impreso por el generador del lexer:  *) functor { símbolo del n}LexFun(structure:  { n}_TOKENS) = extremo del struct... (* impreso en el archivo del sml creado por el generador del programa de análisis:  *) functor { símbolo del n}LrValsFun(structure:  SÍMBOLO) = estructura ParserData del struct = símbolo de la estructura del struct = (* código en la sección del jefe de la especificación *) jefe simbólico de la estructura =...  mecanografíe el svalue =...  mecanografíe el resultado =...  mecanografíe posición =...  estructure las acciones =...  estructure EC =...  tabla val =...  símbolo de la estructura del extremo:  { n}_TOKENS = svalue del tipo del símbolo = de ParserData.Token de la estructura del struct =...  diversión PLUS(p1, p2) =...  diversión INTLIT(i, p1, p2) =...  extremo del extremo (* ser hecho por el usuario:  *) estructura { n}LrVals = { símbolo del n}LrValsFun(structure = LrParser.Token) estructura { n}Lex = { símbolo del n}LexFun(structure = { n}LrVals.Tokens) estructura { n}Parser = Join(structure Lex = { estructura ParserData del n}Lex = { estructura LrParser = LrParser del n}ParserData) 

< atras  siguiente >

 

Hosted by www.Geocities.ws

1