domingo, 7 de septiembre de 2014

Definición de algunos Terminales y No-Terminales en Irony .NET

TERMINALES

Para definir un comentario se utiliza CommentTerminal y en el Constructor se envian 3 parametros:

  1. Nombre que se le dará al termino comentario
  2. Símbolo Inicial del Comentario
  3. Símbolo Final del Comentario

//TERMINALES DE COMENTARIO
CommentTerminal COMENTARIO_LINEA = 
new CommentTerminal("COMENTARIO_LINEA", "//", "\n");
CommentTerminal COMENTARIO_LINEAS = 
new CommentTerminal("COMENTARIO_LINEAS", "/*", "*/");

Es importante que se agreguen a la definicion para que no se tomen como terminales:
       
base.NonGrammarTerminals.Add(COMENTARIO_LINEA);
base.NonGrammarTerminals.Add(COMENTARIO_LINEAS);

Hay algunos terminales que hay por defecto en Irony, tales como definir uhn Identificador, un numero o una cadena:


  • Identificador
        IdentifierTerminal ID = new IdentifierTerminal("ID");
  • Numero
        NumberLiteral NUMERO = new NumberLiteral("NUMERO");
  • Cadenas

        StringLiteral CADENA = new StringLiteral("CADENA", "\"");
                   
             Donde el segundo parametro del constructor es el simbolo con el que                empieza y termina la cadena

Ademas se pueden crear algunos terminales personalizados y para ello se utilizan expresiones regulares: Ejemplo:

RegexBasedTerminal palabra 
= new RegexBasedTerminal("palabra", "[a-zA-Z]+");



NO TERMINALES

Los no terminales se definen de la siguiente manera:

 //2. NO TERMINALES
 NonTerminal nonTerminal = new NonTerminal("nonTerminal");

Para definir las producciones en un no Terminal se utilizan las reglas y los terminales y no terminales se concatenan por medio de el signo +:

Ejemplo:


noTerminal.Rule = terminal + nonTerminal2
                  | terminal2 + nonTermial2;

 Hay reglas especiales en Irony que simplifican las reglas:



  • CREACION DE LISTAS
    • Listas sin simbolo de separacion
              palabras.Rule = MakePlusRule(palabras, palabra);
              
              Reconoce:
                           palabra palabra1 palabra2  palabra3


                        Donde el primer parametro es el no terminal que define la lista,                         y el segundo es el elemento de la lista

    • Listas con simbolo de separacion

            l_ids.Rule = this.MakeListRule(l_ids, ToTerm(","), ID);
            
            Reconoce:
                           id, id, id , id

Donde el primer parametro es el no terminal que define la lista, y el segundo es el simbolo separador de la lista y el tercero es el elemento de la lista.

No hay comentarios:

Publicar un comentario