public void TestCSharpChar()
 {
     SetTerminal(TerminalFactory.CreateCSharpChar("Char"));
     TryMatch("'a'  ");
     Assert.IsTrue((char)_token.Value == 'a', "Failed to process char.");
     TryMatch(@"'\n'  ");
     Assert.IsTrue((char)_token.Value == '\n', "Failed to process new-line char.");
     TryMatch(@"''  ");
     Assert.IsTrue(_token.IsError(), "Failed to recognize empty quotes as invalid char literal.");
     TryMatch(@"'abc'  ");
     Assert.IsTrue(_token.IsError(), "Failed to recognize multi-char sequence as invalid char literal.");
     //Note: unlike strings, c# char literals don't allow the "@" prefix
 }
        public void TestString_CSharpChar()
        {
            var parser = TestHelper.CreateParser(TerminalFactory.CreateCSharpChar("Char"));
            var token  = parser.ParseInput("'a'  ");

            Assert.IsTrue((char)token.Value == 'a', "Failed to process char.");
            token = parser.ParseInput(@"'\n'  ");
            Assert.IsTrue((char)token.Value == '\n', "Failed to process new-line char.");
            token = parser.ParseInput(@"''  ");
            Assert.IsTrue(token.IsError, "Failed to recognize empty quotes as invalid char literal.");
            token = parser.ParseInput(@"'abc'  ");
            Assert.IsTrue(token.IsError, "Failed to recognize multi-char sequence as invalid char literal.");
            //Note: unlike strings, c# char literals don't allow the "@" prefix
        }
Exemple #3
0
        public Gramatica() : base(caseSensitive: true)
        {
            #region ER
            NumberLiteral      doble    = new NumberLiteral("doble");
            IdentifierTerminal id       = new IdentifierTerminal("id");
            StringLiteral      cadena   = TerminalFactory.CreateCSharpString("cadena");
            StringLiteral      carac    = TerminalFactory.CreateCSharpChar("cadena");
            ConstantTerminal   booleano = new ConstantTerminal("booleano");
            booleano.Add("true", true);
            booleano.Add("false", false);
            CommentTerminal comentario2 = new CommentTerminal("comentario2", "</", "/>");
            CommentTerminal comentario1 = new CommentTerminal("comentario1", "-->", "\n", "\r\n");
            base.NonGrammarTerminals.Add(comentario2);
            base.NonGrammarTerminals.Add(comentario1);
            #endregion

            #region Terminales
            var mas          = ToTerm("+");
            var menos        = ToTerm("-");
            var mul          = ToTerm("*");
            var div          = ToTerm("/");
            var mod          = ToTerm("%");
            var pot          = ToTerm("^");
            var parA         = ToTerm("(");
            var parC         = ToTerm(")");
            var corA         = ToTerm("[");
            var corC         = ToTerm("]");
            var llavA        = ToTerm("{");
            var llavC        = ToTerm("}");
            var pYc          = ToTerm(";");
            var dosPuntos    = ToTerm(":");
            var coma         = ToTerm(",");
            var asig         = ToTerm("=");
            var igual        = ToTerm("=");
            var mayor        = ToTerm(">");
            var menor        = ToTerm("<");
            var mayorIgual   = ToTerm(">=");
            var menorIgual   = ToTerm("<=");
            var igualIgual   = ToTerm("==");
            var noIgual      = ToTerm("!=");
            var diferecia    = ToTerm("~");
            var Mostrar      = ToTerm("Mostrar");
            var resInt       = ToTerm("Entero");
            var resDouble    = ToTerm("Decimal");
            var resString    = ToTerm("Texto");
            var resChar      = ToTerm("Caracter");
            var resBool      = ToTerm("Booleano");
            var resVoid      = ToTerm("Vacio");
            var OR           = ToTerm("||");
            var AND          = ToTerm("&&");
            var NOT          = ToTerm("!");
            var resReturn    = ToTerm("Retorno");
            var Es_verdadero = ToTerm("Es_verdadero");
            var Es_false     = ToTerm("Es_falso");
            var Cambiar_A    = ToTerm("Cambiar_A");
            var Valor        = ToTerm("Valor");
            var No_cumple    = ToTerm("No_cumple");
            var Para         = ToTerm("Para");
            var Hasta_que    = ToTerm("Hasta_que");
            var Mientras     = ToTerm("Mientras_que");
            var Romper       = ToTerm("Romper");
            var Continuar    = ToTerm("Continuar");
            var DibujarAST   = ToTerm("DibujarAST");
            var DibujarEXP   = ToTerm("DibujarEXP");
            var DibujarTS    = ToTerm("DibujarTS");
            var Principal    = ToTerm("Principal");
            var Importar     = ToTerm("Importar");
            var Definir      = ToTerm("Definir");
            #endregion

            #region No Terminales
            NonTerminal S           = new NonTerminal("S"),
                        E           = new NonTerminal("E"),
                        EXPR        = new NonTerminal("EXPR"),
                        EXPL        = new NonTerminal("EXPL"),
                        PROGRAMA    = new NonTerminal("PROGRAMA"),
                        CUERPOS     = new NonTerminal("CUERPOS"),
                        CUERPO      = new NonTerminal("CUERPO"),
                        ATRIBUTOS   = new NonTerminal("ATRIBUTOS"),
                        ATRIBUTO    = new NonTerminal("ATRIBUTO"),
                        DECLARACION = new NonTerminal("DECLARACION"),
                        ASIGNACION  = new NonTerminal("ASIGNACION"),
                        PRINCIPAL   = new NonTerminal("PRINCIPAL"),
                        METODO      = new NonTerminal("METODO"),
                        FUNCION     = new NonTerminal("FUNCION"),
                        TIPO        = new NonTerminal("TIPO"),
                        MOSTRAR     = new NonTerminal("MOSTRAR"),
                        MOST        = new NonTerminal("MOST"),
                        DIBUJAR     = new NonTerminal("DIBUJAR"),
                        LISTA_ID    = new NonTerminal("LISTA_ID"),
                        LISTA_PARAM = new NonTerminal("LISTA_PARAM"),
                        DECLA       = new NonTerminal("DECLA"),
                        UNICO       = new NonTerminal("UNICO"),
                        UNICOS      = new NonTerminal("UNICOS"),
                        LLAMADA     = new NonTerminal("LLAMADA"),
                        LLAMFUNC    = new NonTerminal("LLAMFUNC"),
                        OPERANDO    = new NonTerminal("OPERANDO"),
                        RETORNO     = new NonTerminal("RETORNO"),
                        SI          = new NonTerminal("SI"),
                        SINO        = new NonTerminal("SINO"),
                        SINO_SI     = new NonTerminal("SINO_SI"),
                        SINOSI      = new NonTerminal("SINOSI"),
                        INTERRUMPIR = new NonTerminal("INTERRUMPIR"),
                        CASO        = new NonTerminal("CASO"),
                        CASOS       = new NonTerminal("CASOS"),
                        DEFECTO     = new NonTerminal("DEFECTO"),
                        MIENTRAS    = new NonTerminal("MIENTRAS"),
                        PARA        = new NonTerminal("PARA"),
                        OP          = new NonTerminal("OP"),
                        HACER       = new NonTerminal("HACER"),
                        SALIR       = new NonTerminal("SALIR"),
                        DEFINIR     = new NonTerminal("DEFINIR"),
                        IMPORTAR    = new NonTerminal("IMPORTAR"),
                        IMPORTE     = new NonTerminal("IMPORTE");
            #endregion

            #region Gramatica
            S.Rule = PROGRAMA;

            PROGRAMA.Rule = CUERPO;

            CUERPO.Rule = MakePlusRule(CUERPO, CUERPOS);

            CUERPOS.Rule = METODO
                           | FUNCION
                           | PRINCIPAL
                           | DEFINIR
                           | IMPORTAR
                           | DECLARACION
                           | ASIGNACION;
            CUERPOS.ErrorRule = SyntaxError + llavC;
            CUERPOS.ErrorRule = SyntaxError + pYc;

            IMPORTAR.Rule = Importar + IMPORTE + pYc;

            IMPORTE.Rule = MakePlusRule(IMPORTE, ToTerm("."), id);

            DEFINIR.Rule = Definir + cadena + pYc
                           | Definir + doble + pYc;

            ATRIBUTOS.Rule = MakePlusRule(ATRIBUTOS, ATRIBUTO)
                             | Empty;

            ATRIBUTO.Rule = DECLARACION
                            | ASIGNACION
                            | DIBUJAR
                            | MOSTRAR
                            | LLAMFUNC
                            | SALIR
                            | SI
                            | INTERRUMPIR
                            | MIENTRAS
                            | PARA
                            | HACER
                            | RETORNO;
            ATRIBUTO.ErrorRule = SyntaxError + pYc;
            ATRIBUTO.ErrorRule = SyntaxError + llavC;

            METODO.Rule = resVoid + id + parA + LISTA_PARAM + parC + llavA + ATRIBUTOS + llavC;

            FUNCION.Rule = TIPO + id + parA + LISTA_PARAM + parC + llavA + ATRIBUTOS + llavC;

            PRINCIPAL.Rule = resVoid + Principal + parA + parC + llavA + ATRIBUTOS + llavC;

            RETORNO.Rule = resReturn + EXPL + pYc;

            SALIR.Rule = Romper + pYc;

            DECLARACION.Rule = TIPO + LISTA_ID + pYc;

            DECLA.Rule = TIPO + id;

            ASIGNACION.Rule = TIPO + LISTA_ID + asig + EXPL + pYc
                              | id + asig + EXPL + pYc;

            DIBUJAR.Rule = DibujarAST + parA + E + parC + pYc
                           | DibujarEXP + parA + EXPL + parC + pYc
                           | DibujarTS + parA + parC + pYc;

            MOSTRAR.Rule = Mostrar + parA + MOST + parC + pYc;

            MOST.Rule = MakePlusRule(MOST, coma, E);

            LISTA_ID.Rule = MakePlusRule(LISTA_ID, coma, id);

            LISTA_PARAM.Rule = MakePlusRule(LISTA_PARAM, coma, DECLA)
                               | MakePlusRule(LISTA_PARAM, coma, E)
                               | Empty;

            UNICO.Rule = MakePlusRule(UNICO, OPERANDO, UNICOS);

            UNICOS.Rule = E;

            LLAMADA.Rule = id + parA + LISTA_PARAM + parC;

            LLAMFUNC.Rule = LLAMADA + pYc;

            SI.Rule = Es_verdadero + parA + EXPL + parC + llavA + ATRIBUTOS + llavC + SINO;

            SINO.Rule = Es_false + llavA + ATRIBUTOS + llavC
                        | Empty;

            INTERRUMPIR.Rule = Cambiar_A + parA + E + parC + llavA + CASOS + DEFECTO + llavC;

            CASOS.Rule = MakePlusRule(CASOS, CASO)
                         | Empty;

            CASO.Rule = Valor + E + dosPuntos + ATRIBUTOS;

            DEFECTO.Rule = No_cumple + dosPuntos + ATRIBUTOS
                           | Empty;

            MIENTRAS.Rule = Mientras + parA + EXPL + parC + llavA + ATRIBUTOS + llavC;

            PARA.Rule = Para + parA + ASIGNACION + EXPL + pYc + OP + parC + llavA + ATRIBUTOS + llavC;

            OP.Rule = ToTerm("++") | ToTerm("--");

            HACER.Rule = Hasta_que + parA + EXPL + parC + llavA + ATRIBUTOS + llavC;

            OPERANDO.Rule = mas | menos | mul | div | pot | mod;

            TIPO.Rule = resInt
                        | resDouble
                        | resString
                        | resChar
                        | resBool;

            E.Rule = E + mas + E
                     | E + menos + E
                     | E + mul + E
                     | E + div + E
                     | E + mod + E
                     | E + pot + E
                     | parA + E + parC
                     | menos + E
                     | LLAMADA
                     | id
                     | doble
                     | cadena
                     | booleano
                     | carac;

            EXPR.Rule = E + mayor + E
                        | E + menor + E
                        | E + mayorIgual + E
                        | E + menorIgual + E
                        | E + igualIgual + E
                        | E + noIgual + E
                        | E + diferecia + E
                        | E;

            EXPL.Rule = EXPL + OR + EXPL
                        | EXPL + AND + EXPL
                        | NOT + EXPL
                        | EXPR
                        | parA + EXPL + parC;
            #endregion

            #region Preferencias
            this.Root = S;
            this.MarkTransient(TIPO, UNICOS, CUERPOS);
            this.RegisterOperators(1, Associativity.Left, mas, menos);
            this.RegisterOperators(2, Associativity.Left, mul, div, mod);
            this.RegisterOperators(3, Associativity.Right, pot);
            this.RegisterOperators(4, "==", "!=", "<", ">", "<=", ">=");
            this.RegisterOperators(5, Associativity.Left, OR);
            this.RegisterOperators(6, Associativity.Left, AND);
            this.RegisterOperators(7, Associativity.Left, NOT);
            this.RegisterOperators(8, "(", ")");
            this.MarkPunctuation("(", ")", ",", ";", "[", "]", "=", ":", "{", "}");
            #endregion
        }
Exemple #4
0
        public Gramatica() : base(caseSensitive: true)
        {
            #region Terminales

            //comentarios
            CommentTerminal simple   = new CommentTerminal("simple", "//", "\n", "\r\n");
            CommentTerminal multiple = new CommentTerminal("multiple", "/*", "*/");
            NonGrammarTerminals.Add(simple);
            NonGrammarTerminals.Add(multiple);

            //tipos de datos
            var entero   = ToTerm("Int", "Int");
            var cadena   = ToTerm("String", "String");
            var doble    = ToTerm("Double", "Double");
            var booleano = ToTerm("Bool", "Bool");
            var caracter = ToTerm("Char", "Char");
            var vacio    = ToTerm("Void", "Void");

            //palabras reservadas
            var importar       = ToTerm("Import", "Import");
            var retornar       = ToTerm("Return", "Return");
            var imprimir       = ToTerm("Print", "Print");
            var principal      = ToTerm("Main", "Main");
            var comparar       = ToTerm("CompareTo", "CompareTo");
            var obtenerUsuario = ToTerm("GetUser", "GetUser");

            //palabras reservadas de sentencias de control
            var si       = ToTerm("If", "If");
            var sino     = ToTerm("Else", "Else");
            var cambiar  = ToTerm("Switch", "Switch");
            var caso     = ToTerm("Case", "Case");
            var defecto  = ToTerm("Default", "Default");
            var quebrar  = ToTerm("Break", "Break");
            var para     = ToTerm("For", "For");
            var mientras = ToTerm("While", "While");
            var hacer    = ToTerm("Do", "Do");

            //operadores aritmeticos
            var sumar       = ToTerm("+", "+");
            var restar      = ToTerm("-", "-");
            var multiplicar = ToTerm("*", "*");
            var dividir     = ToTerm("/", "/");
            var modular     = ToTerm("%", "%");
            var elevar      = ToTerm("^", "^");
            var asignacion  = ToTerm("=", "=");
            var incremento  = ToTerm("++", "++");
            var decremento  = ToTerm("--", "--");

            //operadores relacionales
            var menorQue      = ToTerm("<", "<");
            var mayorQue      = ToTerm(">", ">");
            var menorIgual    = ToTerm("<=", "<=");
            var mayorIgual    = ToTerm(">=", ">=");
            var equivalente   = ToTerm("==", "==");
            var noEquivalente = ToTerm("!=", "!=");

            //operadores logicos
            var and = ToTerm("&&", "&&");
            var or  = ToTerm("||", "||");
            var xor = ToTerm("|&", "|&");
            var not = ToTerm("!", "!");

            //punctuation mark
            var finSentencia = ToTerm(";", ";");
            var parentesisA  = ToTerm("(", "(");
            var parentesisC  = ToTerm(")", ")");
            var llaveA       = ToTerm("{", "{");
            var llaveC       = ToTerm("}", "}");
            var dosPuntos    = ToTerm(":", ":");
            var corcheteA    = ToTerm("[", "[");
            var corcheteC    = ToTerm("]", "]");
            var coma         = ToTerm(",", ",");
            var punto        = ToTerm(".", ".");

            //valores
            var numero        = TerminalFactory.CreateCSharpNumber("numero");
            var identificador = TerminalFactory.CreateCSharpIdentifier("identificador");
            var cad           = TerminalFactory.CreateCSharpString("cadena");
            var falso         = ToTerm("False", "falso");
            var verdadero     = ToTerm("True", "verdadero");
            var car           = TerminalFactory.CreateCSharpChar("caracter");

            #endregion

            #region Precedencias y puntuaciones
            this.MarkPunctuation(finSentencia, parentesisA, parentesisC,
                                 llaveA, llaveC, dosPuntos, coma, punto);

            RegisterOperators(1, Associativity.Left, sumar, restar);
            RegisterOperators(2, Associativity.Left, multiplicar, modular, dividir);
            RegisterOperators(3, Associativity.Right, elevar);
            RegisterOperators(5, equivalente, noEquivalente, menorQue, menorIgual, mayorQue, mayorIgual);
            RegisterOperators(6, Associativity.Left, or);
            RegisterOperators(7, Associativity.Left, xor);
            RegisterOperators(8, Associativity.Left, and);
            RegisterOperators(9, Associativity.Left, not);
            RegisterOperators(10, parentesisA, parentesisC);

            #endregion

            #region No Terminales

            NonTerminal INICIO               = new NonTerminal("INICIO");
            NonTerminal DECLARACION          = new NonTerminal("DECLARACION");
            NonTerminal PRINCIPAL            = new NonTerminal("PRINCIPAL");
            NonTerminal ASIGNACION           = new NonTerminal("ASIGNACION");
            NonTerminal WHILE                = new NonTerminal("WHILE");
            NonTerminal DO_WHILE             = new NonTerminal("DO_WHILE");
            NonTerminal IF                   = new NonTerminal("IF");
            NonTerminal ELSE                 = new NonTerminal("ELSE");
            NonTerminal FOR                  = new NonTerminal("FOR");
            NonTerminal SWITCH               = new NonTerminal("SWITCH");
            NonTerminal LISTA_ACCIONES       = new NonTerminal("LISTA_ACCIONES");
            NonTerminal ACCION               = new NonTerminal("ACCION");
            NonTerminal IMPORT               = new NonTerminal("IMPORT");
            NonTerminal ENCABEZADO           = new NonTerminal("ENCABEZADO");
            NonTerminal TIPO_DATO            = new NonTerminal("TIPO_DATO");
            NonTerminal LISTA_VARS           = new NonTerminal("LISTA_VARS");
            NonTerminal EXPRESION_LOGICA     = new NonTerminal("EXPRESION_LOGICA");
            NonTerminal EXPRESION_RELACIONAL = new NonTerminal("EXPRESION_RELACIONAL");
            NonTerminal EXPRESION            = new NonTerminal("EXPRESION");
            NonTerminal DECLARACION_ARREGLO  = new NonTerminal("DECLARACION_ARREGLO");
            NonTerminal ASIGNACION_ARREGLO   = new NonTerminal("ASIGNACION_ARREGLO");
            NonTerminal LISTA_DATOS          = new NonTerminal("LISTA_DATOS");
            NonTerminal ASIGNACION_POSICION  = new NonTerminal("ASIGNACION_POSICION");
            NonTerminal SENTENCIA            = new NonTerminal("SENTENCIA");
            NonTerminal LISTA_SENTENCIAS     = new NonTerminal("LISTA_SENTENCIAS");
            NonTerminal PROCEDIMIENTO        = new NonTerminal("PROCEDIMIENTO");
            NonTerminal LISTA_PARAMETROS     = new NonTerminal("LISTA_PARAMETROS");
            NonTerminal PARAMETRO            = new NonTerminal("PARAMETRO");
            NonTerminal FUNCION_PRINT        = new NonTerminal("FUNCION_PRINT");
            NonTerminal FUNCION_COMPARAR     = new NonTerminal("FUNCION_COMPARAR");
            NonTerminal RETORNO              = new NonTerminal("RETORNO");
            NonTerminal OBTENER_USUARIO      = new NonTerminal("OBTENER_USUARIO");
            NonTerminal OPERADOR_RELACIONAL  = new NonTerminal("OPERADOR_RELACIONAL");
            NonTerminal LLAMADA              = new NonTerminal("LLAMADA");
            NonTerminal DINCREMENTO          = new NonTerminal("DINCREMENTO");
            NonTerminal CASE                 = new NonTerminal("CASE");
            NonTerminal DEFAULT              = new NonTerminal("DEFAULT");
            NonTerminal CUERPO_SWITCH        = new NonTerminal("CUERPO_SWITCH");
            NonTerminal LISTA_CASE           = new NonTerminal("LISTA_CASE");
            NonTerminal VALOR                = new NonTerminal("VALOR");
            NonTerminal OPCION_SENTENCIAS    = new NonTerminal("OPCION_SENTENCIAS");

            #endregion

            #region reglas gramaticales

            //Encabezado
            ENCABEZADO.Rule = MakePlusRule(ENCABEZADO, IMPORT)
                              | IMPORT;

            IMPORT.Rule = importar + cad + finSentencia;

            // Cuerpo principal
            this.Root = INICIO;

            INICIO.Rule = ENCABEZADO + LISTA_ACCIONES
                          | ENCABEZADO
                          | LISTA_ACCIONES;

            LISTA_ACCIONES.Rule = MakePlusRule(LISTA_ACCIONES, ACCION)
                                  | ACCION;

            ACCION.Rule = DECLARACION
                          | PROCEDIMIENTO
                          | PRINCIPAL
                          | ASIGNACION
                          | DECLARACION_ARREGLO
                          | ASIGNACION_POSICION
                          | DINCREMENTO + finSentencia
                          | FUNCION_PRINT + finSentencia;

            PRINCIPAL.Rule = principal + dosPuntos + vacio + parentesisA + parentesisC + llaveA + OPCION_SENTENCIAS + llaveC
                             | principal + dosPuntos + TIPO_DATO + parentesisA + LISTA_PARAMETROS + parentesisC
                             + llaveA + OPCION_SENTENCIAS + llaveC
                             | principal + dosPuntos + vacio + parentesisA + LISTA_PARAMETROS + parentesisC + llaveA + OPCION_SENTENCIAS + llaveC
                             | principal + dosPuntos + TIPO_DATO + parentesisA + parentesisC + llaveA + OPCION_SENTENCIAS + llaveC;

            // Sintaxis de las Declaraciones
            TIPO_DATO.Rule = entero | doble | cadena | caracter | booleano;

            LISTA_VARS.Rule = MakePlusRule(LISTA_VARS, coma, identificador);

            DECLARACION.Rule = LISTA_VARS + dosPuntos + TIPO_DATO + asignacion + EXPRESION_LOGICA + finSentencia
                               | identificador + dosPuntos + TIPO_DATO + asignacion + EXPRESION_LOGICA + finSentencia
                               | LISTA_VARS + dosPuntos + TIPO_DATO + finSentencia
                               | identificador + dosPuntos + TIPO_DATO + finSentencia;

            // Sintaxis de las Asignaciones
            ASIGNACION.Rule = identificador + asignacion + EXPRESION_LOGICA + finSentencia
                              | identificador + asignacion + llaveA + LISTA_DATOS + llaveC + finSentencia;

            // Sintaxis de los arreglos
            DECLARACION_ARREGLO.Rule = identificador + dosPuntos + TIPO_DATO
                                       + corcheteA + EXPRESION + corcheteC + finSentencia
                                       | identificador + dosPuntos + TIPO_DATO + corcheteA + EXPRESION + corcheteC
                                       + asignacion + ASIGNACION_ARREGLO + finSentencia;

            LISTA_DATOS.Rule = MakePlusRule(LISTA_DATOS, coma, EXPRESION_LOGICA)
                               | EXPRESION_LOGICA;

            ASIGNACION_ARREGLO.Rule = llaveA + LISTA_DATOS + llaveC
                                      | identificador;

            ASIGNACION_POSICION.Rule = identificador + corcheteA + EXPRESION + corcheteC
                                       + asignacion + EXPRESION_LOGICA + finSentencia;

            //Sintaxis de Metodos y Funciones
            PROCEDIMIENTO.Rule = identificador + dosPuntos + TIPO_DATO
                                 + parentesisA + LISTA_PARAMETROS + parentesisC + llaveA + OPCION_SENTENCIAS + llaveC
                                 | identificador + dosPuntos + vacio
                                 + parentesisA + LISTA_PARAMETROS + parentesisC + llaveA + OPCION_SENTENCIAS + llaveC
                                 | identificador + dosPuntos + TIPO_DATO
                                 + parentesisA + parentesisC + llaveA + OPCION_SENTENCIAS + llaveC
                                 | identificador + dosPuntos + vacio
                                 + parentesisA + parentesisC + llaveA + OPCION_SENTENCIAS + llaveC;

            PARAMETRO.Rule = identificador + dosPuntos + TIPO_DATO
                             | identificador + dosPuntos + TIPO_DATO + corcheteA + corcheteC;

            LISTA_PARAMETROS.Rule = MakePlusRule(LISTA_PARAMETROS, coma, PARAMETRO)
                                    | PARAMETRO;

            LISTA_SENTENCIAS.Rule = MakePlusRule(LISTA_SENTENCIAS, SENTENCIA)
                                    | SENTENCIA;

            OPCION_SENTENCIAS.Rule = LISTA_SENTENCIAS | Empty;

            SENTENCIA.Rule = DECLARACION
                             | ASIGNACION
                             | DECLARACION_ARREGLO
                             | ASIGNACION_POSICION
                             | IF
                             | FOR
                             | SWITCH
                             | WHILE
                             | DO_WHILE
                             | FUNCION_PRINT + finSentencia
                             | DINCREMENTO + finSentencia
                             | LLAMADA + finSentencia
                             | quebrar + finSentencia
                             | RETORNO;

            RETORNO.Rule = retornar + EXPRESION_LOGICA + finSentencia
                           | retornar + finSentencia;

            //Funciones nativas
            FUNCION_PRINT.Rule = imprimir + parentesisA + EXPRESION_LOGICA + parentesisC;

            FUNCION_COMPARAR.Rule = punto + comparar + parentesisA + EXPRESION + parentesisC;

            OBTENER_USUARIO.Rule = obtenerUsuario + parentesisA + parentesisC;

            //If Else
            IF.Rule = si + parentesisA + EXPRESION_LOGICA + parentesisC + llaveA + LISTA_SENTENCIAS + llaveC
                      | si + parentesisA + EXPRESION_LOGICA + parentesisC + llaveA + llaveC
                      | si + parentesisA + EXPRESION_LOGICA + parentesisC + llaveA + LISTA_SENTENCIAS + llaveC + ELSE
                      | si + parentesisA + EXPRESION_LOGICA + parentesisC + llaveA + llaveC + ELSE;

            ELSE.Rule = sino + llaveA + LISTA_SENTENCIAS + llaveC
                        | sino + llaveA + llaveC;

            //While
            WHILE.Rule = mientras + parentesisA + EXPRESION_LOGICA + parentesisC
                         + llaveA + LISTA_SENTENCIAS + llaveC
                         | mientras + parentesisA + EXPRESION_LOGICA + parentesisC + llaveA + llaveC;

            //Do While
            DO_WHILE.Rule = hacer + llaveA + LISTA_SENTENCIAS + llaveC + mientras + parentesisA
                            + EXPRESION_LOGICA + parentesisC + finSentencia
                            | hacer + llaveA + llaveC + mientras + parentesisA + EXPRESION_LOGICA + parentesisC + finSentencia;

            //For
            FOR.Rule = para + parentesisA + identificador + dosPuntos + TIPO_DATO + asignacion + EXPRESION
                       + finSentencia + EXPRESION_LOGICA + finSentencia + DINCREMENTO + parentesisC + llaveA + LISTA_SENTENCIAS
                       + llaveC
                       | para + parentesisA + identificador + dosPuntos + TIPO_DATO + asignacion + EXPRESION
                       + finSentencia + EXPRESION_LOGICA + finSentencia + DINCREMENTO + parentesisC + llaveA + llaveC;

            DINCREMENTO.Rule = identificador + incremento
                               | identificador + decremento;

            //Switch
            SWITCH.Rule = cambiar + parentesisA + identificador + parentesisC + llaveA + CUERPO_SWITCH + llaveC;

            CUERPO_SWITCH.Rule = LISTA_CASE
                                 | LISTA_CASE + DEFAULT;

            LISTA_CASE.Rule = MakePlusRule(LISTA_CASE, CASE)
                              | CASE;

            CASE.Rule = caso + VALOR + dosPuntos + LISTA_SENTENCIAS
                        | caso + VALOR + dosPuntos;

            VALOR.Rule = cad | numero;

            DEFAULT.Rule = defecto + dosPuntos + LISTA_SENTENCIAS
                           | defecto + dosPuntos;

            //Llamadas
            LLAMADA.Rule = identificador + parentesisA + parentesisC
                           | identificador + parentesisA + LISTA_DATOS + parentesisC;

            // Expresiones
            EXPRESION_LOGICA.Rule = EXPRESION_LOGICA + and + EXPRESION_LOGICA
                                    | EXPRESION_LOGICA + or + EXPRESION_LOGICA
                                    | EXPRESION_LOGICA + xor + EXPRESION_LOGICA
                                    | not + EXPRESION_LOGICA
                                    | EXPRESION_RELACIONAL;

            EXPRESION_RELACIONAL.Rule = EXPRESION + OPERADOR_RELACIONAL + EXPRESION
                                        | EXPRESION;

            OPERADOR_RELACIONAL.Rule = menorQue
                                       | menorIgual
                                       | mayorQue
                                       | mayorIgual
                                       | equivalente
                                       | noEquivalente;

            EXPRESION.Rule = EXPRESION + sumar + EXPRESION
                             | EXPRESION + restar + EXPRESION
                             | EXPRESION + multiplicar + EXPRESION
                             | EXPRESION + dividir + EXPRESION
                             | EXPRESION + modular + EXPRESION
                             | EXPRESION + elevar + EXPRESION
                             | restar + EXPRESION
                             | parentesisA + EXPRESION_LOGICA + parentesisC
                             | identificador + corcheteA + EXPRESION + corcheteC
                             | identificador
                             | LLAMADA
                             | OBTENER_USUARIO
                             | verdadero
                             | falso
                             | cad
                             | car
                             | numero
                             | identificador + FUNCION_COMPARAR
                             | identificador + corcheteA + EXPRESION + corcheteC + FUNCION_COMPARAR;
            #endregion
        }
Exemple #5
0
        public Gramatica() : base(caseSensitive: true)
        {
            #region Expresiones Regulares
            //numeros
            RegexBasedTerminal Entero   = new RegexBasedTerminal("Entero", "[0-9]+");
            RegexBasedTerminal Decimal  = new RegexBasedTerminal("Decimal", "[0-9]+[.][0-9]+");
            RegexBasedTerminal IDMetodo = new RegexBasedTerminal("IDMetodo", "[a-zA-Z]+[_]?[0-9]*");

            //id
            IdentifierTerminal Id = new IdentifierTerminal("Id");

            //cadena
            StringLiteral Cadena = new StringLiteral("Cadena", "\"");
            StringLiteral Char   = TerminalFactory.CreateCSharpChar("Char");

            //comentarios
            CommentTerminal COMENTARIOLINEA  = new CommentTerminal("LINE_COMMENT", "//", "\n", "\r\n");
            CommentTerminal COMENTARIOBLOQUE = new CommentTerminal("BLOCK_COMMENT", "/*", "*/");
            #endregion


            #region Terminales
            //tipos de variables.
            var tkVOID   = ToTerm("Void");
            var tkINT    = ToTerm("Int");
            var tkFLOAT  = ToTerm("Float");
            var tkBOOL   = ToTerm("Boolean");
            var tkCHAR   = ToTerm("Char");
            var tkSTRING = ToTerm("String");
            var tkDOUBLE = ToTerm("Double");

            var tkMAIN    = ToTerm("main");
            var tkRETURN  = ToTerm("Return");
            var tkTRUE    = ToTerm("true");
            var tkFALSE   = ToTerm("false");
            var tkIMPORT  = ToTerm("Import");
            var tkFOR     = ToTerm("For");
            var tkIF      = ToTerm("If");
            var tkELSE    = ToTerm("Else");
            var tkDO      = ToTerm("Do");
            var tkWHILE   = ToTerm("While");
            var tkSWITCH  = ToTerm("Switch");
            var tkCASE    = ToTerm("Case");
            var tkDEFAULT = ToTerm("Default");
            var tkBREAK   = ToTerm("Break");
            var tkCOMPARE = ToTerm("CompareTo");
            var tkGETUSER = ToTerm("GetUser");
            var tkPRINT   = ToTerm("Print");
            var ESPACIO   = ToTerm(" ");

            //Simbolos
            var tkMAS        = ToTerm("+");
            var tkMENOS      = ToTerm("-");
            var tkPOR        = ToTerm("*");
            var tkDIV        = ToTerm("/");
            var tkPORCENT    = ToTerm("%");
            var tkPOTENCIA   = ToTerm("^");
            var tkPARA       = ToTerm("(");
            var tkPARC       = ToTerm(")");
            var tkLLAVA      = ToTerm("{");
            var tkLLAVC      = ToTerm("}");
            var tkCORA       = ToTerm("[");
            var tkCORC       = ToTerm("]");
            var tkMENOR      = ToTerm("<");
            var tkMAYOR      = ToTerm(">");
            var tkMENORIGUAL = ToTerm("<=");
            var tkMAYORIGUAL = ToTerm(">=");
            var tkIGUAL      = ToTerm("=");
            var tkDISTINTO   = ToTerm("!");
            var tkOR         = ToTerm("||");
            var tkXOR        = ToTerm("!&");
            var tkAND        = ToTerm("&&");
            var tkPUNTO      = ToTerm(".");
            var tkPUNTOYCOMA = ToTerm(";");
            var tkCOMA       = ToTerm(",");
            var tkDOSPUNTOS  = ToTerm(":");
            var tkAPOSTRO    = ToTerm("\'");

            #endregion

            #region No Terminales
            NonTerminal S                      = new NonTerminal("S"),
                        INICIO                 = new NonTerminal("INICIO"),
                        IMPORTS                = new NonTerminal("IMPORTS"),
                        IMPORTACION            = new NonTerminal("IMPORTACION"),
                        SENTENCIAS             = new NonTerminal("SENTENCIAS"),
                        LISTAIDS               = new NonTerminal("LISTAIDS"),
                        TIPO                   = new NonTerminal("TIPO"),
                        DECLARACIONVARIABLES   = new NonTerminal("DECLARACIONVARIABLES"),
                        MASASIGNACION          = new NonTerminal("MASASIGNACION"),
                        ASIGNACION             = new NonTerminal("ASIGNACION"),
                        OPERACION              = new NonTerminal("OPERACION"),
                        OPERACIONES1           = new NonTerminal("OPERACIONES1"),
                        OPERACIONES2           = new NonTerminal("OPERACIONES2"),
                        OPERACIONES3           = new NonTerminal("OPERACIONES3"),
                        OPERACIONES4           = new NonTerminal("OPERACIONES4"),
                        OPERACIONES5           = new NonTerminal("OPERACIONES5"),
                        OPERACIONES6           = new NonTerminal("OPERACIONES6"),
                        OPERACIONES7           = new NonTerminal("OPERACIONES7"),
                        DECLARACIONMETODOS     = new NonTerminal("DECLARACIONMETODOS"),
                        LISTAPARAMETROS        = new NonTerminal("LISTAPARAMETROS"),
                        LISTASENTENCIAS        = new NonTerminal("LISTASENTENCIAS"),
                        PARAMETRO              = new NonTerminal("PARAMETRO"),
                        IF                     = new NonTerminal("IF"),
                        CONDICIONES            = new NonTerminal("CONDICIONES"),
                        BLOQUEELSE             = new NonTerminal("BLOQUEELSE"),
                        WHILE                  = new NonTerminal("WHILE"),
                        DO                     = new NonTerminal("DO"),
                        CONDICIONES1           = new NonTerminal("CONDICIONES1"),
                        CONDICIONES2           = new NonTerminal("CONDICIONES2"),
                        CONDICIONES3           = new NonTerminal("CONDICIONES3"),
                        CONDICIONES4           = new NonTerminal("CONDICIONES4"),
                        CONDICIONES5           = new NonTerminal("CONDICIONES5"),
                        CONDICIONES6           = new NonTerminal("CONDICIONES6"),
                        CONDICIONES7           = new NonTerminal("CONDICIONES7"),
                        CONDICIONES8           = new NonTerminal("CONDICIONES8"),
                        CONDICIONES9           = new NonTerminal("CONDICIONES9"),
                        CONDICIONES10          = new NonTerminal("CONDICIONES10"),
                        SWITCH                 = new NonTerminal("SWITCH"),
                        LISTACASOS             = new NonTerminal("LISTACASOS"),
                        CASOS                  = new NonTerminal("CASOS"),
                        DEFAULT                = new NonTerminal("DEFAULT"),
                        FOR                    = new NonTerminal("FOR"),
                        INCREODECRE            = new NonTerminal("INCREODECRE"),
                        PRINT                  = new NonTerminal("PRINT"),
                        LISTAEXPRESIONES       = new NonTerminal("LISTAEXPRESIONES"),
                        LLAMADA                = new NonTerminal("LLAMADA"),
                        LISTAPARAMETROSLLAMADA = new NonTerminal("LISTAPARAMETROSLLAMADA"),
                        PAR                    = new NonTerminal("PAR"),
                        RETURN                 = new NonTerminal("RETURN"),
                        ASIGNACIONVAR          = new NonTerminal("ASIGNACIONVAR"),
                        VALOR                  = new NonTerminal("VALOR"),
                        ACCIONES               = new NonTerminal("ACCIONES"),
                        DECLARACIONARREGLOS    = new NonTerminal("DECLARACIONARREGLOS"),
                        AC                     = new NonTerminal("AC"),
                        INICIALIZACIONARREGLO  = new NonTerminal("INICIALIZACIONARREGLO"),
                        LISTADATOS             = new NonTerminal("LISTADATOS"),
                        ASIGNACIONARREGLO      = new NonTerminal("ASIGNACIONARREGLO"),
                        MASASIG                = new NonTerminal("MASASIG");
            #endregion

            #region Gramatica

            S.Rule = IMPORTS + INICIO;
            ;

            IMPORTS.Rule = IMPORTS + IMPORTACION
                           | IMPORTACION
            ;

            IMPORTACION.Rule = tkIMPORT + Cadena + tkPUNTOYCOMA
                               | Empty
            ;

            INICIO.Rule = INICIO + ACCIONES
                          | ACCIONES;

            //UNICAS ACCIONES QUE SE REALIZARAN DE FORMA GLOBAL.
            ACCIONES.Rule = //declaraciones
                            DECLARACIONVARIABLES
                            | DECLARACIONMETODOS
                            | DECLARACIONARREGLOS
                            //asignaciones
                            | ASIGNACIONARREGLO
                            | ASIGNACIONVAR;

            #region DECLARACION DE ARREGLO

            DECLARACIONARREGLOS.Rule = Id + tkDOSPUNTOS + TIPO + tkCORA + OPERACION + tkCORC + INICIALIZACIONARREGLO + tkPUNTOYCOMA;

            INICIALIZACIONARREGLO.Rule = tkIGUAL + tkLLAVA + LISTADATOS + tkLLAVC
                                         | Empty;

            LISTADATOS.Rule = LISTADATOS + tkCOMA + CONDICIONES
                              | CONDICIONES;
            #endregion

            #region ASIGNACION DE ARREGLOS

            ASIGNACIONARREGLO.Rule = Id + tkIGUAL + INICIALIZACIONARREGLO + tkPUNTOYCOMA
                                     | Id + tkCORA + OPERACION + tkCORC + tkIGUAL + CONDICIONES + tkPUNTOYCOMA;

            #endregion

            #region DECLARACION DE VARIABLES MULTIPLES

            DECLARACIONVARIABLES.Rule = Id + MASASIG;

            MASASIG.Rule = tkCOMA + LISTAIDS + tkDOSPUNTOS + TIPO + ASIGNACION + tkPUNTOYCOMA
                           | tkDOSPUNTOS + TIPO + ASIGNACION + tkPUNTOYCOMA;

            LISTAIDS.Rule = LISTAIDS + tkCOMA + Id
                            | Id;

            TIPO.Rule = tkINT
                        | tkDOUBLE
                        | tkSTRING
                        | tkCHAR
                        | tkBOOL;

            ASIGNACION.Rule = tkIGUAL + CONDICIONES  //<-- (OPERACIONES ARITMETICAS)
                              | Empty;

            #endregion

            #region ASIGNACION DE VARIABLE

            ASIGNACIONVAR.Rule = Id + tkIGUAL + CONDICIONES + tkPUNTOYCOMA
                                 | Id + INCREODECRE + tkPUNTOYCOMA;
            #endregion

            #region DECLARACION METODOS

            DECLARACIONMETODOS.Rule = Id + tkDOSPUNTOS + TIPO + tkPARA + LISTAPARAMETROS + tkPARC + tkLLAVA + LISTASENTENCIAS + tkLLAVC;

            LISTAPARAMETROS.Rule = LISTAPARAMETROS + tkCOMA + PARAMETRO
                                   | PARAMETRO;

            PARAMETRO.Rule = Id + tkDOSPUNTOS + TIPO
                             | Empty;

            #endregion

            #region LISTASENTENCIAS

            LISTASENTENCIAS.Rule = LISTASENTENCIAS + SENTENCIAS     //a esta produccion caeran todas las sentencias de metodos, if´s, etc.
                                   | SENTENCIAS;

            SENTENCIAS.Rule = IF
                              | SWITCH
                              | FOR
                              | DO
                              | WHILE
                              | PRINT
                              | LLAMADA + tkPUNTOYCOMA
                              | tkRETURN + OPERACION + tkPUNTOYCOMA       //return
                              | tkBREAK + tkPUNTOYCOMA                    //break
                              | ACCIONES
                              | Empty;
            #endregion

            #region IF-ELSE
            IF.Rule = tkIF + tkPARA + CONDICIONES + tkPARC + tkLLAVA + LISTASENTENCIAS + tkLLAVC + BLOQUEELSE;

            BLOQUEELSE.Rule = tkELSE + tkLLAVA + LISTASENTENCIAS + tkLLAVC
                              | Empty;
            #endregion

            #region SWITCH

            SWITCH.Rule = tkSWITCH + tkPARA + OPERACION + tkPARC + tkLLAVA + LISTACASOS + DEFAULT + tkLLAVC;

            LISTACASOS.Rule = LISTACASOS + CASOS
                              | CASOS;

            CASOS.Rule = tkCASE + OPERACION + tkDOSPUNTOS + LISTASENTENCIAS + tkBREAK + tkPUNTOYCOMA;

            DEFAULT.Rule = tkDEFAULT + tkDOSPUNTOS + LISTASENTENCIAS + tkBREAK + tkPUNTOYCOMA
                           | Empty;

            #endregion

            #region FOR
            FOR.Rule = tkFOR + tkPARA + DECLARACIONVARIABLES + CONDICIONES + tkPUNTOYCOMA + Id + INCREODECRE + tkPARC + tkLLAVA + LISTASENTENCIAS + tkLLAVC;

            INCREODECRE.Rule = tkMAS + tkMAS
                               | tkMENOS + tkMENOS;
            #endregion

            #region DO-WHILE

            DO.Rule = tkDO + tkLLAVA + LISTASENTENCIAS + tkLLAVC + tkWHILE + tkPARA + CONDICIONES + tkPARC;
            #endregion

            #region WHILE

            WHILE.Rule = tkWHILE + tkPARA + CONDICIONES + tkPARC + tkLLAVA + LISTASENTENCIAS + tkLLAVC;

            #endregion

            #region PRINT

            PRINT.Rule = tkPRINT + tkPARA + LISTAEXPRESIONES + tkPARC + tkPUNTOYCOMA;

            LISTAEXPRESIONES.Rule = LISTAEXPRESIONES + tkMAS + OPERACION
                                    | OPERACION;

            #endregion

            #region LLAMADA METODO
            LLAMADA.Rule = Id + tkPARA + PAR + tkPARC;

            PAR.Rule = LISTAPARAMETROSLLAMADA
                       | Empty;

            LISTAPARAMETROSLLAMADA.Rule = LISTAPARAMETROSLLAMADA + tkCOMA + CONDICIONES
                                          | CONDICIONES;


            #endregion

            #region OPERACIONES ARITMETICAS

            OPERACION.Rule = OPERACION + tkMAS + OPERACIONES1
                             | OPERACIONES1;

            OPERACIONES1.Rule = OPERACIONES1 + tkMENOS + OPERACIONES2
                                | OPERACIONES2;
            ;

            OPERACIONES2.Rule = OPERACIONES2 + tkPOR + OPERACIONES3
                                | OPERACIONES3;
            ;

            OPERACIONES3.Rule = OPERACIONES3 + tkDIV + OPERACIONES4
                                | OPERACIONES4;
            ;

            OPERACIONES4.Rule = OPERACIONES4 + tkPORCENT + OPERACIONES5
                                | OPERACIONES5;
            ;

            OPERACIONES5.Rule = OPERACIONES5 + tkPOTENCIA + OPERACIONES6
                                | OPERACIONES6;

            OPERACIONES6.Rule = tkMENOS + OPERACIONES7
                                | OPERACIONES7;

            OPERACIONES7.Rule = Entero
                                | Decimal
                                | Id
                                | Id + tkCORA + OPERACION + tkCORC      //acceso a una posicion de un arreglo
                                | Char                                  //| Id + INCREODECRE
                                | Cadena
                                | LLAMADA                               //llamada a un metodo
                                | tkGETUSER + tkPARA + tkPARC           //funcion privada  que devuelde el usuario logeado
                                | tkPARA + OPERACION + tkPARC
                                | tkTRUE
                                | tkFALSE
                                //|CONDICIONES
            ;
            #endregion

            #region OPERACIONES LOGICAS Y RELACIONALES (CONDICIONES)

            CONDICIONES.Rule = CONDICIONES + tkIGUAL + tkIGUAL + CONDICIONES1
                               | CONDICIONES1
            ;

            CONDICIONES1.Rule = CONDICIONES1 + tkDISTINTO + tkIGUAL + CONDICIONES2
                                | CONDICIONES2
            ;

            CONDICIONES2.Rule = CONDICIONES2 + tkMAYORIGUAL + CONDICIONES3
                                | CONDICIONES3
            ;

            CONDICIONES3.Rule = CONDICIONES3 + tkMENORIGUAL + CONDICIONES4
                                | CONDICIONES4
            ;

            CONDICIONES4.Rule = CONDICIONES4 + tkMAYOR + CONDICIONES5
                                | CONDICIONES5
            ;

            CONDICIONES5.Rule = CONDICIONES5 + tkMENOR + CONDICIONES6
                                | CONDICIONES6
            ;

            CONDICIONES6.Rule = CONDICIONES6 + tkOR + CONDICIONES7
                                | CONDICIONES7
            ;

            CONDICIONES7.Rule = CONDICIONES7 + tkXOR + CONDICIONES8
                                | CONDICIONES8
            ;

            CONDICIONES8.Rule = CONDICIONES8 + tkAND + CONDICIONES9
                                | CONDICIONES9
            ;

            CONDICIONES9.Rule = tkDISTINTO + CONDICIONES10  // < --- funcionara como not
                                | CONDICIONES10
            ;

            CONDICIONES10.Rule = OPERACION
                                 | Id + tkPUNTO + tkCOMPARE + tkPARA + Cadena + tkPARC          //compare porque siempre devolvera un tru o un false
                                 | tkPARA + CONDICIONES + tkPARC
            ;
            #endregion

            #region Comentarios
            //agregamos los comentarios y si vienen que no haga nada.
            NonGrammarTerminals.Add(COMENTARIOLINEA);
            NonGrammarTerminals.Add(COMENTARIOBLOQUE);
            #endregion


            #endregion

            #region Estado de Inicio
            this.Root = S;
            #endregion
        }
        public Gramatica() : base(caseSensitive: false)
        {
            #region EXPRESION REGULAR
            RegexBasedTerminal numero               = new RegexBasedTerminal("numero", "[0-9]+");
            RegexBasedTerminal Decimal              = new RegexBasedTerminal("Decimal", "[0-9]+\\.[0-9]+");
            StringLiteral      cadena               = new StringLiteral("cadena", "\"");
            StringLiteral      caracter             = TerminalFactory.CreateCSharpChar("caracter");
            IdentifierTerminal id                   = new IdentifierTerminal("id");
            CommentTerminal    comentarioUnaLinea   = new CommentTerminal("comentarioUnaLinea", ">>", "\n", "\r\n");
            CommentTerminal    comentarioMultilinea = new CommentTerminal("comentarioMultilinea", "<-", "->");
            NonGrammarTerminals.Add(comentarioUnaLinea);
            NonGrammarTerminals.Add(comentarioMultilinea);
            #endregion

            #region TERMINALES
            var punto = ToTerm(".");
            var coma  = ToTerm(",");
            //operadores aritméticos y lógicos
            var mayor      = ToTerm(">");
            var menor      = ToTerm("<");
            var igual      = ToTerm("=");
            var mayorigual = ToTerm(">=");
            var menorigual = ToTerm("<=");
            var igualigual = ToTerm("==");
            var not        = ToTerm("!");
            var diferente  = ToTerm("!=");
            var and        = ToTerm("&&");
            var or         = ToTerm("||");
            var potencia   = ToTerm("^");
            var mult       = ToTerm("*");
            var div        = ToTerm("/");
            var mas        = ToTerm("+");
            var menos      = ToTerm("-");
            var parAbre    = ToTerm("(");
            var parCierra  = ToTerm(")");
            var llavAbre   = ToTerm("{");
            var llavCierra = ToTerm("}");
            //tipos de dato
            var Int    = ToTerm("int");
            var String = ToTerm("string");
            var Double = ToTerm("double");
            var Char   = ToTerm("char");
            var Bool   = ToTerm("bool");
            //tipos de acceso
            var publico = ToTerm("publico");
            var privado = ToTerm("privado");
            //palabras reservadas
            var clase     = ToTerm("clase");
            var importar  = ToTerm("importar");
            var Void      = ToTerm("void");
            var array     = ToTerm("array");
            var True      = ToTerm("true");
            var False     = ToTerm("false");
            var verdadero = ToTerm("verdadero");
            var falso     = ToTerm("falso");
            var New       = ToTerm("new");
            var main      = ToTerm("main");
            var Override  = ToTerm("Override");
            var If        = ToTerm("if");
            var Else      = ToTerm("else");
            var For       = ToTerm("for");
            var repeat    = ToTerm("repeat");
            var While     = ToTerm("while");
            var comprobar = ToTerm("comprobar");
            var caso      = ToTerm("caso");
            var salir     = ToTerm("salir");
            var defecto   = ToTerm("defecto");
            var hacer     = ToTerm("hacer");
            var mientras  = ToTerm("mientras");
            var Return    = ToTerm("return");
            var print     = ToTerm("print");
            var show      = ToTerm("show");
            var continuar = ToTerm("continuar");

            var addFigure = ToTerm("addfigure");
            var circle    = ToTerm("circle");
            var triangle  = ToTerm("triangle");
            var square    = ToTerm("square");
            var line      = ToTerm("line");
            #endregion

            #region NO TERMINALES
            NonTerminal S                = new NonTerminal("S");
            NonTerminal LISTA_CLASES     = new NonTerminal("LISTA_CLASES");
            NonTerminal CLASE            = new NonTerminal("CLASE");
            NonTerminal IMPORTAR         = new NonTerminal("IMPORTAR");
            NonTerminal LISTA_CUERPO     = new NonTerminal("LISTA_CUERPO");
            NonTerminal CUERPO           = new NonTerminal("CUERPO");
            NonTerminal MAIN             = new NonTerminal("MAIN");
            NonTerminal METODO           = new NonTerminal("METODO");
            NonTerminal FUNCION          = new NonTerminal("FUNCION");
            NonTerminal FUNCION_HEADER   = new NonTerminal("FUNCION_HEADER");
            NonTerminal FUNCION_PARAM    = new NonTerminal("FUNCION_PARAM");
            NonTerminal DECLARACION      = new NonTerminal("DECLARACION");
            NonTerminal DECLA_VARIABLES  = new NonTerminal("DECLA_VARIABLES");
            NonTerminal VAR              = new NonTerminal("VAR");
            NonTerminal VAR_ID           = new NonTerminal("VAR_ID");
            NonTerminal ACCESO           = new NonTerminal("ACCESO");
            NonTerminal LISTA_ID         = new NonTerminal("LISTA_ID");
            NonTerminal DIMENSION        = new NonTerminal("DIMENSION");
            NonTerminal ARRAY_INIT       = new NonTerminal("ARRAY_INIT");
            NonTerminal LISTA_LLAV       = new NonTerminal("LISTA_LLAV");
            NonTerminal LLAVE            = new NonTerminal("LLAVE");
            NonTerminal LISTA_EXP        = new NonTerminal("LISTA_EXP");
            NonTerminal TIPO             = new NonTerminal("TIPO");
            NonTerminal EXP              = new NonTerminal("EXP");
            NonTerminal VALOR            = new NonTerminal("VALOR");
            NonTerminal LISTA_PARAMETROS = new NonTerminal("LISTA_PARAMETROS");
            NonTerminal PARAMETRO        = new NonTerminal("PARAMETRO");
            NonTerminal RETORNO          = new NonTerminal("RETORNO");
            NonTerminal L_SENTENCIAS     = new NonTerminal("L_SENTENCIAS");
            NonTerminal SENTENCIA        = new NonTerminal("SENTENCIA");
            NonTerminal INIT             = new NonTerminal("INIT");
            NonTerminal IF               = new NonTerminal("IF");
            NonTerminal IF_LIST          = new NonTerminal("IF_LIST");
            NonTerminal FOR              = new NonTerminal("FOR");
            NonTerminal FOR_INIT         = new NonTerminal("FOR_INIT");
            NonTerminal REPEAT           = new NonTerminal("REPEAT");
            NonTerminal WHILE            = new NonTerminal("WHILE");
            NonTerminal COMPROBAR        = new NonTerminal("COMPROBAR");
            NonTerminal CASOS            = new NonTerminal("CASOS");
            NonTerminal CASO             = new NonTerminal("CASO");
            NonTerminal HACER            = new NonTerminal("HACER");
            NonTerminal PASOS            = new NonTerminal("PASOS");
            NonTerminal FIGURA           = new NonTerminal("FIGURA");
            NonTerminal CALL             = new NonTerminal("CALL");
            #endregion

            #region GRAMATICA
            S.Rule = LISTA_CLASES
            ;

            LISTA_CLASES.Rule = LISTA_CLASES + CLASE
                                | CLASE
            ;

            CLASE.Rule = clase + id + IMPORTAR + "{" + LISTA_CUERPO + "}"
                         | clase + id + "{" + LISTA_CUERPO + "}"
            ;

            IMPORTAR.Rule = importar + LISTA_ID
            ;

            LISTA_ID.Rule = LISTA_ID + coma + id
                            | id
            ;

            LISTA_CUERPO.Rule = LISTA_CUERPO + CUERPO
                                | CUERPO
            ;

            CUERPO.Rule = FUNCION
                          | MAIN
                          | DECLARACION + ";"
                          //| EXP + ";"
            ;

            DECLARACION.Rule = ACCESO + TIPO + LISTA_ID + igual + EXP                              //5 **
                               | ACCESO + TIPO + array + LISTA_ID + DIMENSION + igual + ARRAY_INIT //7
                               | TIPO + LISTA_ID + igual + EXP                                     //4 **
                               | TIPO + array + LISTA_ID + DIMENSION + igual + ARRAY_INIT          //6 **
                               | ACCESO + TIPO + LISTA_ID                                          //3 **
                               | ACCESO + TIPO + array + LISTA_ID + DIMENSION                      //5 **
                               | TIPO + LISTA_ID                                                   //2 **
                               | TIPO + array + LISTA_ID + DIMENSION                               //4 **
                                                                                                   //De tipo id
                               | ACCESO + id + LISTA_ID + igual + EXP                              //5
                               | id + LISTA_ID + igual + EXP                                       //4
                               | ACCESO + id + LISTA_ID                                            //3
                               | id + LISTA_ID                                                     //2

            ;

            FUNCION.Rule = FUNCION_HEADER + "{" + L_SENTENCIAS + "}"
            ;

            //FUNCION_PARAM.Rule = FUNCION_HEADER + "(" + LISTA_PARAMETROS + ")"
            //                   | FUNCION_HEADER + "(" + ")"
            //                   ;

            FUNCION_HEADER.Rule = //CON PARÁMETROS
                                  ACCESO + id + Void + "(" + LISTA_PARAMETROS + ")"
                                  | ACCESO + id + Void + Override + "(" + LISTA_PARAMETROS + ")"
                                  | id + Void + Override + "(" + LISTA_PARAMETROS + ")"
                                  | id + Void + "(" + LISTA_PARAMETROS + ")"
                                  //Funciones con retorno
                                  | ACCESO + id + TIPO + "(" + LISTA_PARAMETROS + ")"
                                  | ACCESO + id + TIPO + Override + "(" + LISTA_PARAMETROS + ")"
                                  | id + TIPO + Override + "(" + LISTA_PARAMETROS + ")"
                                  | id + TIPO + "(" + LISTA_PARAMETROS + ")"
                                  //Funciones con retorno de arreglos
                                  | ACCESO + id + array + TIPO + DIMENSION + "(" + LISTA_PARAMETROS + ")"
                                  | id + array + TIPO + DIMENSION + "(" + LISTA_PARAMETROS + ")"
                                  //SIN PARÁMETROS
                                  | ACCESO + id + Void + "(" + ")"
                                  | ACCESO + id + Void + Override + "(" + ")"
                                  | id + Void + Override + "(" + ")"
                                  | id + Void + "(" + ")"
                                  //Funciones con retorno
                                  | ACCESO + id + TIPO + "(" + ")"
                                  | ACCESO + id + TIPO + Override + "(" + ")"
                                  | id + TIPO + Override + "(" + ")"
                                  | id + TIPO + "(" + ")"
                                  //Funciones con retorno de arreglos
                                  | ACCESO + id + array + TIPO + DIMENSION + "(" + ")"
                                  | id + array + TIPO + DIMENSION + "(" + ")"
                                  //###########   DE TIPO ID
                                  | ACCESO + id + id + "(" + LISTA_PARAMETROS + ")"
                                  | ACCESO + id + id + Override + "(" + LISTA_PARAMETROS + ")"
                                  | id + id + Override + "(" + LISTA_PARAMETROS + ")"
                                  | id + id + "(" + LISTA_PARAMETROS + ")"
                                  | ACCESO + id + id + "(" + ")"
                                  | ACCESO + id + id + Override + "(" + ")"
                                  | id + id + Override + "(" + ")"
                                  | id + id + "(" + ")"
            ;

            MAIN.Rule = main + "(" + ")" + "{" + L_SENTENCIAS + "}"
            ;

            L_SENTENCIAS.Rule = MakeStarRule(L_SENTENCIAS, SENTENCIA);

            //L_SENTENCIAS.Rule = L_SENTENCIAS + SENTENCIA
            //                | SENTENCIA
            //                ;

            SENTENCIA.Rule = DECLARACION + ";"                           //1*
                             | Return + EXP + ";"                        //2*
                             | Return + ";"                              //1
                             | EXP + ";"                                 //1*
                             | continuar + ";"                           //1
                             | salir + ";"                               //1
                             | print + "(" + EXP + ")" + ";"             //2*
                             | show + "(" + EXP + coma + EXP + ")" + ";" //4
                             | addFigure + "(" + FIGURA + ")"            //2
                             | IF                                        //1*
                             | FOR                                       //1**
                             | REPEAT                                    //1**
                             | WHILE                                     //1**
                             | HACER                                     //1*
                             | COMPROBAR                                 //1*
            ;

            IF.Rule = IF_LIST + Else + "{" + L_SENTENCIAS + "}"
                      | IF_LIST
            ;

            IF_LIST.Rule = IF_LIST + Else + If + "(" + EXP + ")" + "{" + L_SENTENCIAS + "}"
                           | If + "(" + EXP + ")" + "{" + L_SENTENCIAS + "}"
            ;

            FOR.Rule = For + "(" + FOR_INIT + ";" + EXP + ";" + id + mas + mas + ")" + "{" + L_SENTENCIAS + "}"
                       | For + "(" + FOR_INIT + ";" + EXP + ";" + id + menos + menos + ")" + "{" + L_SENTENCIAS + "}"
            ;

            FOR_INIT.Rule = DECLARACION
                            | EXP
            ;

            REPEAT.Rule = repeat + "(" + EXP + ")" + "{" + L_SENTENCIAS + "}"
            ;

            WHILE.Rule = While + "(" + EXP + ")" + "{" + L_SENTENCIAS + "}"
            ;

            HACER.Rule = hacer + "{" + L_SENTENCIAS + "}" + mientras + "(" + EXP + ")" + ";"
            ;

            COMPROBAR.Rule = comprobar + "(" + EXP + ")" + "{" + CASOS + "}"
                             | comprobar + "(" + EXP + ")" + "{" + CASOS + defecto + ":" + L_SENTENCIAS + "}"
            ;

            //CASOS.Rule = CASOS + caso + EXP + ":" + L_SENTENCIAS + salir + ";"
            //           | caso + EXP + ":" + L_SENTENCIAS + salir + ";"
            //           ;

            CASOS.Rule = MakePlusRule(CASOS, CASO);

            CASO.Rule = caso + EXP + ":" + L_SENTENCIAS
            ;

            FIGURA.Rule = circle + "(" + LISTA_EXP + ")"        //color, radio, solido, posx centro, posy centro
                          | triangle + "(" + LISTA_EXP + ")"    //color, solido, puntox v1, puntoy v1, puntox v2, puntoy v2, puntox v3, puntoy v3
                          | square + "(" + LISTA_EXP + ")"      //color, solido, posx centro, posy centro, alto, ancho
                          | line + "(" + LISTA_EXP + ")"        //color, posx inicio, posy inicio, posx final, posy final, grosor
            ;


            ACCESO.Rule = publico
                          | privado
            ;

            LISTA_PARAMETROS.Rule = LISTA_PARAMETROS + coma + PARAMETRO
                                    | PARAMETRO
            ;

            PARAMETRO.Rule = TIPO + id
                             | id + id
            ;

            TIPO.Rule = Int
                        | String
                        | Double
                        | Char
                        | Bool
            ;

            DIMENSION.Rule = DIMENSION + "[" + EXP + "]"
                             | "[" + EXP + "]"
            ;

            ARRAY_INIT.Rule = "{" + LISTA_LLAV + "}"
            ;

            LISTA_LLAV.Rule = LISTA_LLAV + coma + LLAVE
                              | LLAVE
            ;

            LLAVE.Rule = ToTerm("{") + LISTA_LLAV + ToTerm("}")
                         | LISTA_EXP
            ;

            LISTA_EXP.Rule = LISTA_EXP + coma + EXP
                             | EXP
            ;

            EXP.Rule = EXP + igual + EXP            //3
                       | EXP + or + EXP
                       | EXP + and + EXP
                       | EXP + potencia + EXP
                       | not + EXP
                       | EXP + mayor + EXP
                       | EXP + menor + EXP
                       | EXP + mayorigual + EXP
                       | EXP + menorigual + EXP
                       | EXP + igualigual + EXP
                       | EXP + diferente + EXP
                       | EXP + mas + EXP
                       | EXP + menos + EXP
                       | EXP + mult + EXP
                       | EXP + div + EXP
                       | menos + EXP
                       | EXP + mas + mas
                       | EXP + menos + menos
                       | "(" + EXP + ")"
                       | New + id + "(" + ")"       //2
                       | Decimal
                       | numero
                       | id
                       | id + punto + EXP           //3
                       | id + CALL                  //2
                       | cadena
                       | caracter
                       | verdadero
                       | falso
                       | True
                       | False
                       | id + DIMENSION             //2
            ;

            CALL.Rule = "(" + LISTA_EXP + ")"
                        | "(" + ")"
            ;

            #endregion

            #region PREFERENCIAS
            this.Root = S;
            MarkPunctuation("{", "}", "(", ")", ";", "[", "]", ":");

            RegisterOperators(7, Associativity.Right, "^");
            RegisterOperators(6, Associativity.Left, "*", "/");
            RegisterOperators(5, Associativity.Left, "+", "-");
            RegisterOperators(4, Associativity.Left, ">", "<", ">=", "<=", "==", "!=", "=");
            RegisterOperators(3, Associativity.Right, "!");
            RegisterOperators(2, Associativity.Left, "&&");
            RegisterOperators(1, Associativity.Left, "||");
            #endregion
        }
        public Gramatica() : base(caseSensitive: false)
        {
            #region ER
            //RegexBasedTerminal numero = new RegexBasedTerminal("int", "[0-9]+");
            RegexBasedTerminal dec      = new RegexBasedTerminal("double", "[0-9]+[.][0-9]+");
            RegexBasedTerminal booleano = new RegexBasedTerminal("bool", "verdadero|falso|true|false");

            NumberLiteral numero = TerminalFactory.CreateCSharpNumber("int");


            IdentifierTerminal id = new IdentifierTerminal("id");

            StringLiteral cadena   = TerminalFactory.CreateCSharpString("string");
            StringLiteral caracter = TerminalFactory.CreateCSharpChar("char");

            CommentTerminal simple = new CommentTerminal("simple", ">>", "\n", "\r\n");
            CommentTerminal multi  = new CommentTerminal("multi", "<-", "->");



            #endregion


            #region Terminales
            var mas         = ToTerm("+");
            var menos       = ToTerm("-");
            var div         = ToTerm("/");
            var por         = ToTerm("*");
            var para        = ToTerm("(");
            var parc        = ToTerm(")");
            var elevar      = ToTerm("^");
            var aumento     = ToTerm("++");
            var decremento  = ToTerm("--");
            var igual       = ToTerm("=");
            var not         = ToTerm("!");
            var diferente   = ToTerm("!=");
            var equivalente = ToTerm("==");
            var or          = ToTerm("||");
            var and         = ToTerm("&&");
            var menorque    = ToTerm("<");
            var mayorque    = ToTerm(">");
            var menorigual  = ToTerm("<=");
            var mayorigual  = ToTerm(">=");
            var puntocoma   = ToTerm(";");
            var coma        = ToTerm(",");
            var punto       = ToTerm(".");
            var dospuntos   = ToTerm(":");
            var llavea      = ToTerm("{");
            var llavec      = ToTerm("}");
            var corchetea   = ToTerm("[");
            var corchetec   = ToTerm("]");
            var tint        = ToTerm("int");
            var tdouble     = ToTerm("double");
            var tstring     = ToTerm("string");
            var tchar       = ToTerm("char");
            var tbool       = ToTerm("bool");
            var array       = ToTerm("array");
            var clase       = ToTerm("clase");
            var importar    = ToTerm("importar");
            var publico     = ToTerm("publico");
            var privado     = ToTerm("privado");
            var tvoid       = ToTerm("void");
            var tnew        = ToTerm("new");
            var toverride   = ToTerm("override");
            var main        = ToTerm("main");
            var treturn     = ToTerm("return");
            var print       = ToTerm("print");
            var show        = ToTerm("show");
            var tif         = ToTerm("if");
            var telse       = ToTerm("else");
            var tfor        = ToTerm("for");
            var repeat      = ToTerm("repeat");
            var twhile      = ToTerm("while");
            var salir       = ToTerm("salir");
            var comprobar   = ToTerm("comprobar");
            var caso        = ToTerm("caso");
            var defecto     = ToTerm("defecto");
            var hacer       = ToTerm("hacer");
            var mientras    = ToTerm("mientras");
            var continuar   = ToTerm("continuar");
            var addfigure   = ToTerm("addfigure");
            var line        = ToTerm("line");
            var triangle    = ToTerm("triangle");
            var square      = ToTerm("square");
            var circle      = ToTerm("circle");
            var figure      = ToTerm("figure");

            #endregion


            #region No Terminales
            NonTerminal INICIO             = new NonTerminal("INICIO"),
                        LISTACLASES        = new NonTerminal("LISTACLASES"),
                        CLASE              = new NonTerminal("CLASE"),
                        OBJETO             = new NonTerminal("OBJETO"),
                        LISTAINSTRUCCIONES = new NonTerminal("LISTAINSTRUCCIONES"),
                        LISTAMETODOS       = new NonTerminal("LISTAMETODOS"),
                        INSTRUCCION        = new NonTerminal("INSTRUCCION"),
                        METODO             = new NonTerminal("METODO"),
                        LISTAPARAM         = new NonTerminal("LISTAPARAM"),
                        LISTAENVIADA       = new NonTerminal("LISTAENVIADA"),
                        LISTAIDES          = new NonTerminal("LISTAIDES"),
                        DECLARACION        = new NonTerminal("DECLARACION"),
                        ASIGNACION         = new NonTerminal("ASIGNACION"),
                        VISIBILIDAD        = new NonTerminal("VISIBILIDAD"),
                        METODOVOID         = new NonTerminal("METODOVOID"),
                        METODORETURN       = new NonTerminal("METODORETURN"),
                        FUNCION            = new NonTerminal("FUNCION"),
                        RETURN             = new NonTerminal("RETURN"),
                        PRINT              = new NonTerminal("PRINT"),
                        IF              = new NonTerminal("IF"),
                        FOR             = new NonTerminal("FOR"),
                        REPEAT          = new NonTerminal("REPEAT"),
                        WHILE           = new NonTerminal("WHILE"),
                        COMPROBAR       = new NonTerminal("COMPROBAR"),
                        OPCION          = new NonTerminal("OPCION"),
                        DOWHILE         = new NonTerminal("DOWHILE"),
                        ADDFIGURA       = new NonTerminal("ADDFIGURA"),
                        FIGURA          = new NonTerminal("FIGURA"),
                        IFELSE          = new NonTerminal("IF ELSE"),
                        SHOW            = new NonTerminal("SHOW"),
                        LISTAIFELSE     = new NonTerminal("LISTAIFELSE"),
                        TIPO            = new NonTerminal("TIPO"),
                        LISTACASOS      = new NonTerminal("LISTACASOS"),
                        CONTINUAR       = new NonTerminal("CONTINUAR"),
                        CASO            = new NonTerminal("CASO"),
                        SALIR           = new NonTerminal("SALIR"),
                        PARAMETRO       = new NonTerminal("PARAMETRO"),
                        E               = new NonTerminal("E"),
                        MROBJECT        = new NonTerminal("MROBJECT"),
                        CALL            = new NonTerminal("CALL"),
                        AUMENTO         = new NonTerminal("AUMENTO"),
                        ACCESOVAR       = new NonTerminal("ACCESOVAR"),
                        DECREMENTO      = new NonTerminal("DECREMENTO"),
                        CAMBIO          = new NonTerminal("CAMBIO"),
                        DIMENSION       = new NonTerminal("DIMENSION"),
                        ASARREGLO       = new NonTerminal("ASARREGLO"),
                        AS1             = new NonTerminal("AS1"),
                        AS2             = new NonTerminal("AS2"),
                        AS3             = new NonTerminal("AS3"),
                        RETURNARREGLO   = new NonTerminal("RETURNARREGLO"),
                        LISTAEXTRA      = new NonTerminal("LISTAEXTRA"),
                        EXTRA           = new NonTerminal("EXTRA"),
                        PRUEBA          = new NonTerminal("PRUEBA"),
                        LISTAPRUEBA     = new NonTerminal("LISTAPRUEBA"),
                        ASIGNACIONARRAY = new NonTerminal("ASIGNACIONARRAY"),
                        TOARRAY         = new NonTerminal("TOARRAY"),
                        DARREGLO        = new NonTerminal("DARREGLO");
            #endregion


            #region Gramatica
            //precedencia
            this.RegisterOperators(0, Associativity.Left, or);
            this.RegisterOperators(1, Associativity.Left, and);
            this.RegisterOperators(2, Associativity.Left, not);
            this.RegisterOperators(3, Associativity.Left, equivalente, diferente, mayorigual, mayorque, menorque, menorigual);
            this.RegisterOperators(4, Associativity.Left, mas, menos);
            this.RegisterOperators(5, Associativity.Left, por, div);
            this.RegisterOperators(6, Associativity.Left, elevar);

            //marcar como puntuacion para que no aparezca en el arbol
            this.MarkPunctuation(para, array, treturn, hacer, mientras, punto, twhile, parc, puntocoma, coma, dospuntos, llavea, llavec, corchetea, corchetec, igual, clase, importar, tvoid, print, show, tif, telse, tfor, repeat);

            //no tomar para el analisis
            this.NonGrammarTerminals.Add(simple);
            this.NonGrammarTerminals.Add(multi);

            //hacer intrasendentes para optimizar el arbol
            this.MarkTransient(INSTRUCCION, TIPO, METODO, ASARREGLO, EXTRA, PRUEBA);

            //palabras reservadas para no confundir con ids
            this.MarkReservedWords("array", "clase", "importar", "publico", "privado", "void", "new", "override", "main", "return", "print", "show", "if", "else", "for", "repeat", "while", "salir", "comprobar", "caso", "defecto", "hacer", "mientras", "continuar", "addfigure", "circle", "triangle", "line", "square", "figure");


            INICIO.Rule = LISTACLASES;

            //SOLO UN NODO ACTUANDO COMO LISTA
            LISTACLASES.Rule = MakePlusRule(LISTACLASES, CLASE);


            CLASE.Rule = clase + id + llavea + LISTAINSTRUCCIONES + LISTAMETODOS + llavec
                         | clase + id + llavea + LISTAINSTRUCCIONES + llavec
                         | clase + id + llavea + LISTAMETODOS + llavec
                         | clase + id + llavea + llavec
                         | clase + id + importar + LISTAIDES + llavea + LISTAINSTRUCCIONES + LISTAMETODOS + llavec
                         | clase + id + importar + LISTAIDES + llavea + LISTAINSTRUCCIONES + llavec
                         | clase + id + importar + LISTAIDES + llavea + LISTAMETODOS + llavec
                         | clase + id + importar + LISTAIDES + llavea + llavec;

            LISTAIDES.Rule = MakePlusRule(LISTAIDES, coma, id);

            LISTAINSTRUCCIONES.Rule = MakePlusRule(LISTAINSTRUCCIONES, INSTRUCCION);

            LISTAMETODOS.Rule = MakePlusRule(LISTAMETODOS, METODO);

            INSTRUCCION.Rule = DECLARACION
                               | ASIGNACION
                               | FUNCION
                               | PRINT
                               | SHOW
                               | IF
                               | FOR
                               | COMPROBAR
                               | SALIR
                               | CONTINUAR
                               | WHILE
                               | DOWHILE
                               | REPEAT
                               | RETURN
                               | E
                               | CAMBIO
                               | OBJETO
                               | MROBJECT
                               | DARREGLO
                               | ASIGNACIONARRAY
            ;

            DARREGLO.Rule = TIPO + array + LISTAIDES + DIMENSION + puntocoma
                            | VISIBILIDAD + TIPO + array + LISTAIDES + DIMENSION + puntocoma
                            | TIPO + array + LISTAIDES + DIMENSION + igual + ASARREGLO + puntocoma
                            | VISIBILIDAD + TIPO + array + LISTAIDES + DIMENSION + igual + ASARREGLO + puntocoma
            ;

            ASARREGLO.Rule = AS1 | AS2 | AS3 | E;

            AS1.Rule = llavea + LISTAENVIADA + llavec;

            AS2.Rule = llavea + LISTAEXTRA + llavec;

            AS3.Rule = llavea + LISTAPRUEBA + llavec;

            LISTAPRUEBA.Rule = MakePlusRule(LISTAPRUEBA, coma, PRUEBA);

            PRUEBA.Rule = llavea + LISTAEXTRA + llavec;

            LISTAEXTRA.Rule = MakePlusRule(LISTAEXTRA, coma, EXTRA);

            EXTRA.Rule = llavea + LISTAENVIADA + llavec;

            DIMENSION.Rule = corchetea + E + corchetec
                             | corchetea + E + corchetec + corchetea + E + corchetec
                             | corchetea + E + corchetec + corchetea + E + corchetec + corchetea + E + corchetec;

            ASIGNACIONARRAY.Rule = id + igual + ASARREGLO + puntocoma;

            MROBJECT.Rule = id + id + igual + id + para + parc + puntocoma;

            OBJETO.Rule = id + id + puntocoma
                          | id + id + igual + tnew + id + para + parc + puntocoma;

            CAMBIO.Rule = AUMENTO
                          | DECREMENTO;

            AUMENTO.Rule = id + aumento + puntocoma;

            DECREMENTO.Rule = id + decremento + puntocoma;

            METODO.Rule = METODOVOID
                          | METODORETURN;

            METODOVOID.Rule = main + para + parc + llavea + LISTAINSTRUCCIONES + llavec//MAIN
                              | VISIBILIDAD + id + tvoid + toverride + para + LISTAPARAM + parc + llavea + LISTAINSTRUCCIONES + llavec
                              | id + tvoid + toverride + para + LISTAPARAM + parc + llavea + LISTAINSTRUCCIONES + llavec
                              | VISIBILIDAD + id + tvoid + para + LISTAPARAM + parc + llavea + LISTAINSTRUCCIONES + llavec
                              | id + tvoid + para + LISTAPARAM + parc + llavea + LISTAINSTRUCCIONES + llavec
                              | VISIBILIDAD + id + tvoid + toverride + para + parc + llavea + LISTAINSTRUCCIONES + llavec
                              | id + tvoid + toverride + para + parc + llavea + LISTAINSTRUCCIONES + llavec
                              | VISIBILIDAD + id + tvoid + para + parc + llavea + LISTAINSTRUCCIONES + llavec
                              | id + tvoid + para + parc + llavea + LISTAINSTRUCCIONES + llavec
            ;

            METODORETURN.Rule = VISIBILIDAD + id + TIPO + toverride + para + LISTAPARAM + parc + llavea + LISTAINSTRUCCIONES + llavec
                                | id + TIPO + toverride + para + LISTAPARAM + parc + llavea + LISTAINSTRUCCIONES + llavec
                                | VISIBILIDAD + id + TIPO + para + LISTAPARAM + parc + llavea + LISTAINSTRUCCIONES + llavec
                                | id + TIPO + para + LISTAPARAM + parc + llavea + LISTAINSTRUCCIONES + llavec
                                | VISIBILIDAD + id + TIPO + toverride + para + parc + llavea + LISTAINSTRUCCIONES + llavec
                                | id + TIPO + toverride + para + parc + llavea + LISTAINSTRUCCIONES + llavec
                                | VISIBILIDAD + id + TIPO + para + parc + llavea + LISTAINSTRUCCIONES + llavec
                                | id + TIPO + para + parc + llavea + LISTAINSTRUCCIONES + llavec
                                | RETURNARREGLO;
            ;

            RETURNARREGLO.Rule = VISIBILIDAD + id + array + TIPO + DIMENSION + para + parc + llavea + LISTAINSTRUCCIONES + llavec
                                 | id + array + TIPO + DIMENSION + para + parc + llavea + LISTAINSTRUCCIONES + llavec
                                 | VISIBILIDAD + id + array + TIPO + DIMENSION + para + LISTAPARAM + parc + llavea + LISTAINSTRUCCIONES + llavec
                                 | id + array + TIPO + DIMENSION + para + LISTAPARAM + parc + llavea + LISTAINSTRUCCIONES + llavec;


            DECLARACION.Rule = VISIBILIDAD + TIPO + LISTAIDES + igual + E + puntocoma
                               | TIPO + LISTAIDES + igual + E + puntocoma
                               | TIPO + LISTAIDES + puntocoma
                               | VISIBILIDAD + TIPO + LISTAIDES + puntocoma
            ;

            LISTAPARAM.Rule = MakePlusRule(LISTAPARAM, coma, PARAMETRO);

            PARAMETRO.Rule = TIPO + E
                             | TIPO + TOARRAY;

            ASIGNACION.Rule = id + igual + E + puntocoma
                              | TOARRAY + igual + E + puntocoma
                              | id + punto + id + igual + E + puntocoma
                              | id + punto + TOARRAY + igual + E + puntocoma;

            VISIBILIDAD.Rule = publico
                               | privado;

            TIPO.Rule = tint
                        | tdouble
                        | tstring
                        | tchar
                        | tbool
                        | id
                        | TOARRAY;

            RETURN.Rule = treturn + E + puntocoma;

            FUNCION.Rule = id + para + LISTAENVIADA + parc + puntocoma
                           | id + para + parc + puntocoma
                           | id + punto + id + para + parc + puntocoma
                           | id + punto + id + para + LISTAENVIADA + parc + puntocoma;

            LISTAENVIADA.Rule = MakePlusRule(LISTAENVIADA, coma, E);

            PRINT.Rule = print + para + E + parc + puntocoma;

            SHOW.Rule = show + para + E + coma + E + parc + puntocoma;

            IF.Rule = tif + para + E + parc + llavea + LISTAINSTRUCCIONES + llavec
                      | tif + para + E + parc + llavea + LISTAINSTRUCCIONES + llavec + telse + llavea + LISTAINSTRUCCIONES + llavec
                      | tif + para + E + parc + llavea + LISTAINSTRUCCIONES + llavec + LISTAIFELSE + telse + llavea + LISTAINSTRUCCIONES + llavec
            ;

            LISTAIFELSE.Rule = MakePlusRule(LISTAIFELSE, IFELSE);

            IFELSE.Rule = telse + tif + para + E + parc + llavea + LISTAINSTRUCCIONES + llavec;

            FOR.Rule = tfor + para + OPCION + E + puntocoma + E + parc + llavea + LISTAINSTRUCCIONES + llavec;

            OPCION.Rule = ASIGNACION | DECLARACION;

            REPEAT.Rule = repeat + para + E + parc + llavea + LISTAINSTRUCCIONES + llavec;

            WHILE.Rule = twhile + para + E + parc + llavea + LISTAINSTRUCCIONES + llavec;

            COMPROBAR.Rule = comprobar + para + E + parc + llavea + LISTACASOS + llavec;

            LISTACASOS.Rule = MakePlusRule(LISTACASOS, CASO);

            CASO.Rule = caso + E + dospuntos + LISTAINSTRUCCIONES
                        | defecto + dospuntos + LISTAINSTRUCCIONES;

            SALIR.Rule = salir + puntocoma;

            DOWHILE.Rule = hacer + llavea + LISTAINSTRUCCIONES + llavec + mientras + para + E + parc + puntocoma;

            CONTINUAR.Rule = continuar + puntocoma;

            E.Rule = E + mas + E
                     | E + menos + E
                     | E + por + E
                     | E + div + E
                     | E + elevar + E
                     | E + equivalente + E
                     | E + diferente + E
                     | E + mayorque + E
                     | E + mayorigual + E
                     | E + menorigual + E
                     | E + menorque + E
                     | menos + E
                     | E + aumento
                     | E + decremento
                     | E + or + E
                     | E + and + E
                     | not + E
                     | para + E + parc
                     | numero
                     | dec
                     | id
                     | booleano
                     | cadena
                     | caracter
                     | CALL
                     | tnew + id + para + parc
                     | ACCESOVAR
                     | TOARRAY
            ;

            TOARRAY.Rule = id + DIMENSION;

            CALL.Rule = id + para + parc
                        | id + para + LISTAENVIADA + parc
                        | id + punto + id + para + parc
                        | id + punto + id + para + LISTAENVIADA + parc;

            ACCESOVAR.Rule = id + punto + id;


            #endregion


            #region Raiz
            this.Root = INICIO;
            #endregion
        }
Exemple #8
0
        public Gramatica() : base(caseSensitive: false)
        {
            #region ER

            /*NUMERO ENTERO*/
            RegexBasedTerminal numentero = new RegexBasedTerminal("Int", "[0-9]+");

            /*NUMERO DECIMAL*/
            RegexBasedTerminal numdecimal = new RegexBasedTerminal("double", "[0-9]+[.][0-9]+");

            /*IDENTIFICADOR*/
            IdentifierTerminal id = new IdentifierTerminal("id");

            /*STRING*/
            //CommentTerminal cadena = new CommentTerminal("String", "\"", ".", "\"");
            StringLiteral cadena = TerminalFactory.CreateCSharpString("String");
            /*STRING*/
            CommentTerminal importaciones = new CommentTerminal("String", "\"", ".[.].", "\"");

            /*CHAR*/
            StringLiteral caracter = TerminalFactory.CreateCSharpChar("Char");

            CommentTerminal comentarioLinea  = new CommentTerminal("comentarioLinea", "//", "\n", "\r\n");
            CommentTerminal comentarioBloque = new CommentTerminal("comentarioBloque", "/*", "*/");

            #endregion

            //--------------------------------------RESERVADAS------------------------------------------------

            #region Terminal

            //TIPO DATO
            var rint    = ToTerm("Int");
            var rdouble = ToTerm("Double");
            var rstring = ToTerm("String");
            var rchar   = ToTerm("Char");
            var rbool   = ToTerm("Boolean");
            var rvoid   = ToTerm("Void");

            //PALABRAS RESERVADAS
            var importar = ToTerm("Import");
            var retornar = ToTerm("Return");
            var rprint   = ToTerm("Print");
            var rmain    = ToTerm("Main");
            var comparar = ToTerm("CompareTo");
            var rGetUser = ToTerm("GetUser");
            var rbreak   = ToTerm("Break");

            //OPERACIONES ARITMETICAS
            var mas      = ToTerm("+");
            var menos    = ToTerm("-");
            var por      = ToTerm("*");
            var dividir  = ToTerm("/");
            var modulo   = ToTerm("%");
            var potencia = ToTerm("^");

            //OPERACIONES RELACIONALES
            var igual2     = ToTerm("==");
            var diferente  = ToTerm("!=");
            var menor      = ToTerm("<");
            var mayor      = ToTerm(">");
            var menorigual = ToTerm("<=");
            var mayorigual = ToTerm(">=");

            //OPERACIONES LOGICAS
            var rand = ToTerm("&&");
            var ror  = ToTerm("||");
            var rxor = ToTerm("|&");
            var rnot = ToTerm("!");

            //OPERACIONES ESPECIALES
            var incremento = ToTerm("++");
            var decremento = ToTerm("--");
            var masigual   = ToTerm("+=");
            var menosigual = ToTerm("-=");

            //SENTENCIAS
            var rif     = ToTerm("If");
            var relse   = ToTerm("Else");
            var relseif = ToTerm("Else if");
            var rswitch = ToTerm("Switch");
            var rcase   = ToTerm("Case");
            var defecto = ToTerm("Default");
            var rfor    = ToTerm("For");
            var rdo     = ToTerm("Do");
            var rwhile  = ToTerm("While");

            //BOOLEANOS
            var rtrue  = ToTerm("true");
            var rfalse = ToTerm("false");

            //VARIOS
            var igual1    = ToTerm("=");
            var dospuntos = ToTerm(":");
            var coma      = ToTerm(",");
            var fin       = ToTerm(";");
            var apar      = ToTerm("(");
            var cpar      = ToTerm(")");
            var alla      = ToTerm("{");
            var clla      = ToTerm("}");
            var acor      = ToTerm("[");
            var ccor      = ToTerm("]");

            #endregion

            #region No terminales

            NonTerminal INICIO             = new NonTerminal("INICIO");
            NonTerminal IMPORTE            = new NonTerminal("IMPORTE");
            NonTerminal IMPORTES           = new NonTerminal("IMPORTES");
            NonTerminal CUERPO             = new NonTerminal("CUERPO");
            NonTerminal CONTENIDOGENERAL   = new NonTerminal("CONTENIDOGENERAL");
            NonTerminal ASIGNA             = new NonTerminal("ASIGNA");
            NonTerminal DECLARA            = new NonTerminal("DECLARA");
            NonTerminal LISTA_IDS          = new NonTerminal("LISTA_IDS");
            NonTerminal TIPODATO           = new NonTerminal("TIPODATO");
            NonTerminal VALOR              = new NonTerminal("VALOR");
            NonTerminal EXPRESION          = new NonTerminal("EXPRESION");
            NonTerminal METODO             = new NonTerminal("METODO");
            NonTerminal LISTAPARAMETROS    = new NonTerminal("LISTAPARAMETROS");
            NonTerminal CUERPOMETODO       = new NonTerminal("CUERPOMETODO");
            NonTerminal LLAMADAMETODO      = new NonTerminal("LLAMADAMETODO");
            NonTerminal IMPRIMIR           = new NonTerminal("IMPRIMIR");
            NonTerminal PARAMETROSLLAMADOS = new NonTerminal("PARAMETROSLLAMADOS");
            NonTerminal OPCIONAL           = new NonTerminal("OPCIONAL");
            NonTerminal SENTENCIARETURN    = new NonTerminal("SENTENCIARETURN");
            NonTerminal SENTENCIAWHILE     = new NonTerminal("SENTENCIAWHILE");
            NonTerminal SENTENCIADOWHILE   = new NonTerminal("SENTENCIADOWHILE");
            NonTerminal SENTENCIASWITCH    = new NonTerminal("SENTENCIASWITCH");
            NonTerminal CASO            = new NonTerminal("CASO");
            NonTerminal CASOS           = new NonTerminal("CASOS");
            NonTerminal DEFECTO         = new NonTerminal("DEFECTO");
            NonTerminal CONTENIDOSWITCH = new NonTerminal("CONTENIDOSWITCH");
            NonTerminal LISTA_ARRAY     = new NonTerminal(" LISTA_ARRAY");

            NonTerminal CONDICION        = new NonTerminal("CONDICION");
            NonTerminal CONDICIONPRIMA   = new NonTerminal("CONDICIONPRIMA");
            NonTerminal CONDICIONAL      = new NonTerminal("CONDICIONAL");
            NonTerminal LOGICOS          = new NonTerminal("LOGICOS");
            NonTerminal RELACIONAL       = new NonTerminal("RELACIONAL");
            NonTerminal SENTENCIAIF      = new NonTerminal("SENTENCIAIF");
            NonTerminal SENTENCIAIFAUX   = new NonTerminal("SENTENCIAIFAUX");
            NonTerminal SENTPRIMA        = new NonTerminal("SENTPRIMA");
            NonTerminal SENTENCIAELSEIF  = new NonTerminal("SENTENCIAELSEIF");
            NonTerminal SENTENCIA        = new NonTerminal("SENTENCIA");
            NonTerminal SENTENCIAS       = new NonTerminal("SENTENCIAS");
            NonTerminal SENTENCIAFOR     = new NonTerminal("SENTENCIAFOR");
            NonTerminal ASIGNACION_CORTO = new NonTerminal("ASIGNACION_CORTO");
            NonTerminal C = new NonTerminal("C");
            NonTerminal D = new NonTerminal("D");

            NonTerminal OPMATEMATICA  = new NonTerminal("OPMATEMATICA");
            NonTerminal OP            = new NonTerminal("OP");
            NonTerminal E             = new NonTerminal("E");
            NonTerminal L             = new NonTerminal("L");
            NonTerminal R             = new NonTerminal("R");
            NonTerminal INVOCAR       = new NonTerminal("INVOCAR");
            NonTerminal LIST_ATRIBUTO = new NonTerminal("LIST_ATRIBUTO");
            NonTerminal ACCESO_VECTOR = new NonTerminal("ACCESO_VECTOR");
            NonTerminal ATRIBUTO      = new NonTerminal("ATRIBUTO");

            #endregion

            #region Gramatica

            INICIO.Rule = IMPORTES + CUERPO;

            IMPORTES.Rule = IMPORTES + IMPORTE
                            | IMPORTE
                            | Empty;

            IMPORTE.Rule = importar + importaciones + fin;

            CUERPO.Rule = CUERPO + CONTENIDOGENERAL
                          | CONTENIDOGENERAL;

            CONTENIDOGENERAL.Rule = DECLARA
                                    | ASIGNA
                                    | METODO;

            DECLARA.Rule = id + dospuntos + TIPODATO + VALOR
                           | LISTA_IDS + dospuntos + TIPODATO + VALOR
                           | id + dospuntos + TIPODATO + acor + E + ccor + VALOR;

            ASIGNA.Rule = id + igual1 + C + fin
                          | id + igual1 + alla + LISTA_ARRAY + clla + fin
                          | id + acor + E + ccor + igual1 + C + fin
                          | id + acor + E + ccor + igual1 + id + acor + E + ccor + fin;

            VALOR.Rule = igual1 + C + fin
                         | fin
                         | alla + LISTA_ARRAY + clla + fin;

            LISTA_IDS.Rule = LISTA_IDS + coma + id
                             | id;

            LISTA_ARRAY.Rule = LISTA_ARRAY + coma + C
                               | C;

            TIPODATO.Rule = rint
                            | rdouble
                            | rstring
                            | rchar
                            | rbool
                            | rvoid;

            METODO.Rule = id + dospuntos + TIPODATO + apar + LISTAPARAMETROS + cpar + alla + SENTENCIAS + clla
                          | rmain + dospuntos + TIPODATO + apar + LISTAPARAMETROS + cpar + alla + SENTENCIAS + clla;

            LISTAPARAMETROS.Rule = LISTAPARAMETROS + coma + id + dospuntos + TIPODATO
                                   | id + dospuntos + TIPODATO
                                   | Empty;

            SENTENCIAS.Rule = SENTENCIAS + SENTENCIA
                              | SENTENCIA;

            SENTENCIA.Rule = ASIGNA
                             | DECLARA
                             | LLAMADAMETODO + fin
                             | IMPRIMIR
                             | SENTENCIAFOR
                             | SENTENCIAIF
                             | SENTENCIARETURN
                             | SENTENCIAWHILE
                             | SENTENCIADOWHILE
                             | SENTENCIASWITCH
                             | Empty;

            //---------LLAMADA A METODO
            LLAMADAMETODO.Rule = id + apar + PARAMETROSLLAMADOS + cpar
                                 | id + apar + cpar;

            PARAMETROSLLAMADOS.Rule = PARAMETROSLLAMADOS + coma + C
                                      | C;

            //---------PRINT
            IMPRIMIR.Rule = rprint + apar + C + cpar;

            //---------RETURN
            SENTENCIARETURN.Rule = C + fin
                                   | fin;

            //---------FOR
            //falta contenido
            SENTENCIAFOR.Rule = rfor + apar + id + dospuntos + TIPODATO + igual1 + E + fin + C + fin + OP + cpar + alla + SENTENCIAS + clla;

            //---------IF
            SENTENCIAIF.Rule = rif + SENTENCIAIFAUX;

            SENTENCIAIFAUX.Rule      = apar + C + cpar + alla + SENTENCIAS + clla + SENTENCIAELSEIF;
            SENTENCIAIFAUX.ErrorRule = SyntaxError + "}";

            SENTENCIAELSEIF.Rule = relse + SENTPRIMA
                                   | Empty;
            SENTENCIAELSEIF.ErrorRule = SyntaxError + "}";

            SENTPRIMA.Rule = rif + SENTENCIAIFAUX
                             | alla + SENTENCIAS + clla;

            //---------WHILE
            SENTENCIAWHILE.Rule      = rwhile + apar + C + cpar + alla + SENTENCIAS + clla;
            SENTENCIAWHILE.ErrorRule = SyntaxError + "}";

            //---------DO WHILE
            SENTENCIADOWHILE.Rule      = rdo + alla + SENTENCIAS + clla + rwhile + apar + C + cpar + fin;
            SENTENCIADOWHILE.ErrorRule = SyntaxError + ";";

            ///--------SWITCH
            SENTENCIASWITCH.Rule      = rswitch + apar + E + cpar + alla + SENTENCIAS + clla;
            SENTENCIASWITCH.ErrorRule = SyntaxError + "}";

            CONTENIDOSWITCH.Rule = CASOS + DEFECTO
                                   | CASOS
                                   | DEFECTO
                                   | Empty;

            CASOS.Rule = CASOS + CASO
                         | CASO;

            //---FALTA CONTENIDO
            CASO.Rule = rcase + C + dospuntos + SENTENCIAS + rbreak + fin;

            //---FALTA CONTENIDO
            DEFECTO.Rule = defecto + SENTENCIAS + dospuntos;

            //CONDICION
            ASIGNACION_CORTO.Rule = id + OP;

            OP.Rule = incremento | decremento;

            C.Rule = C + L + C
                     | E + R + E
                     | menos + E
                     | E;

            R.Rule = igual2
                     | diferente
                     | menor
                     | mayor
                     | menorigual
                     | mayorigual;

            L.Rule = ror
                     | rand
                     | rxor
                     | rnot;

            E.Rule = E + mas + E
                     | E + menos + E
                     | E + por + E
                     | E + dividir + E
                     | E + modulo + E
                     | E + potencia + E
                     | apar + E + cpar
                     | id
                     | numentero
                     | numdecimal
                     | cadena
                     | caracter
                     | rtrue
                     | rfalse;

            INVOCAR.Rule = id + apar + LIST_ATRIBUTO + cpar
                           | ACCESO_VECTOR;

            LIST_ATRIBUTO.Rule = LIST_ATRIBUTO + coma + ATRIBUTO
                                 | ATRIBUTO
                                 | Empty;

            ATRIBUTO.Rule = E;

            #endregion

            #region PREFERENCIAS
            Root = INICIO;

            NonGrammarTerminals.Add(comentarioLinea);
            NonGrammarTerminals.Add(comentarioBloque);

            MarkPunctuation(";", "(", ")", "{", "}", ":", "=", "[", "]", ",");

            this.RegisterOperators(1, Associativity.Left, mas, menos);
            this.RegisterOperators(2, Associativity.Left, por, dividir, modulo);
            this.RegisterOperators(3, Associativity.Right, potencia);
            this.RegisterOperators(5, igual2, diferente, menor, mayor, menorigual, mayorigual);
            this.RegisterOperators(6, Associativity.Left, ror);
            this.RegisterOperators(7, Associativity.Left, rxor);
            this.RegisterOperators(8, Associativity.Left, rand);
            this.RegisterOperators(9, Associativity.Left, diferente);
            this.RegisterOperators(10, apar, cpar);
            #endregion
        }
Exemple #9
0
        public Grammar() : base(caseSensitive: false)
        {
            #region ER
            RegexBasedTerminal num              = new RegexBasedTerminal("num", "[0-9]+");
            RegexBasedTerminal dec              = new RegexBasedTerminal("dec", "[0-9]+[.][0-9]+");
            RegexBasedTerminal rtrue            = new RegexBasedTerminal("rtrue", "true|verdadero");
            RegexBasedTerminal rfalse           = new RegexBasedTerminal("rfalse", "false|falso");
            CommentTerminal    com_linea        = new CommentTerminal("comentariolinea", ">>", "\n", "\r\n");
            CommentTerminal    comentarioBloque = new CommentTerminal("comentarioBloque", "<-", "->");
            CommentTerminal    com_multi        = new CommentTerminal("comentariomulti", "<-", "->");

            StringLiteral      StringLiteral = TerminalFactory.CreateCSharpString("String");
            StringLiteral      CharLiteral   = TerminalFactory.CreateCSharpChar("Char");
            IdentifierTerminal identifier    = new IdentifierTerminal("Identifier");

            NonGrammarTerminals.Add(com_linea);
            NonGrammarTerminals.Add(comentarioBloque);
            NonGrammarTerminals.Add(com_multi);
            #endregion

            #region Terminales

            /*simbolos*/
            var igual      = ToTerm("=");
            var aumento    = ToTerm("++");
            var decremento = ToTerm("--");
            var punto      = ToTerm(".");


            /*aritmeticos*/
            var mas     = ToTerm("+");
            var menos   = ToTerm("-");
            var por     = ToTerm("*");
            var entre   = ToTerm("/");
            var elevado = ToTerm("^");

            /*relacionales*/
            var igualLogico = ToTerm("==");
            var desigual    = ToTerm("!=");
            var mayor       = ToTerm(">");
            var mayorigual  = ToTerm(">=");
            var menor       = ToTerm("<");
            var menorigual  = ToTerm("<=");

            /*logicos*/
            var or  = ToTerm("||");
            var and = ToTerm("&&");
            var not = ToTerm("!");


            /*tipos de dato*/
            var rint    = ToTerm("int");
            var rdouble = ToTerm("double");
            var rbool   = ToTerm("bool");
            var rchar   = ToTerm("char");
            var rstring = ToTerm("string");
            var rarray  = ToTerm("array");

            /*Reservadas*/
            var rclase    = ToTerm("clase");
            var rimportar = ToTerm("importar");
            var rvoid     = ToTerm("void");
            var rpublico  = ToTerm("publico");
            var rprivado  = ToTerm("privado");
            var rreturn   = ToTerm("return");
            var rnew      = ToTerm("new");
            var roverride = ToTerm("override");
            var rmain     = ToTerm("main");
            var rprint    = ToTerm("print");
            var rshow     = ToTerm("show");

            /*sentencias*/
            var rif        = ToTerm("if");
            var relse      = ToTerm("else");
            var rfor       = ToTerm("for");
            var rrepeat    = ToTerm("repeat");
            var rwhile     = ToTerm("while");
            var rcomprobar = ToTerm("comprobar");
            var rcaso      = ToTerm("caso");
            var rsalir     = ToTerm("salir");
            var rdefecto   = ToTerm("defecto");
            var rhacer     = ToTerm("hacer");
            var rmientras  = ToTerm("mientras");
            var rcontinuar = ToTerm("continuar");

            /*figure*/
            var raddfigure = ToTerm("addfigure");
            var rcircle    = ToTerm("circle");
            var rtriangle  = ToTerm("triangle");
            var rsquare    = ToTerm("square");
            var rline      = ToTerm("line");
            var rfigure    = ToTerm("figure");

            #endregion

            #region No Terminales
            NonTerminal S = new NonTerminal("S"),
                        E = new NonTerminal("E"),
                        FUNCION = new NonTerminal("Funcion"), PARAMFUNCION = new NonTerminal("ParamFuncion"),
                        BLOQUE = new NonTerminal("BLOQUE"), LISTA_BLOQUE = new NonTerminal("LISTA_BLOQUE"),
                        ASIGNACION = new NonTerminal("Asignacion"), DECLARACION = new NonTerminal("Declaracion"),
                        METODOS = new NonTerminal("Metodos"), SENTENCIAS = new NonTerminal("Sentencias"),
                        LID = new NonTerminal("ListaId"), T_DATO = new NonTerminal("TipoDato"), DIM = new NonTerminal("Dimension"),
                        LDIM = new NonTerminal("LDim"), DIM1 = new NonTerminal("Dim1"), DIM2 = new NonTerminal("Dim2"), DIM3 = new NonTerminal("Dim3"),
                        LISTACLASE = new NonTerminal("ListaClase"), BLOCKCLASE = new NonTerminal("Bloqueclase"),
                        LPARAMETROS = new NonTerminal("ListaParametros"), VISIBILIDAD = new NonTerminal("Visibilidad"),
                        OVERRIDE = new NonTerminal("Override"), LISTAMSENTENCIA = new NonTerminal("ListaMSentencia"), MSENTENCIA = new NonTerminal("MSentencia"),
                        INMETODO = new NonTerminal("InMetodo"), BLOQUESHOW = new NonTerminal("BloqueShow"), BLOQUEPRINT = new NonTerminal("BloquePrint"),
                        BLOQUEIF = new NonTerminal("BloqueIf"), BLOQUEREPETIR = new NonTerminal("BloqueRepetir"), BLOQUEFOR = new NonTerminal("BloqueFor"),
                        BLOQUEWHILE = new NonTerminal("BloqueWhile"), BLOQUEELSEIF = new NonTerminal("BloqueElseIf"), BLOQUEHACER = new NonTerminal("BloqueHacer"),
                        BLOQUECOMPROBAR = new NonTerminal("BloqueComprobar"), BLOQUECASO = new NonTerminal("BloqueCaso"), ADDFIGURE = new NonTerminal("AddFigure"),
                        FIGURE = new NonTerminal("Figure"), TFIGURE = new NonTerminal("TFigure"), B3 = new NonTerminal("B3"), B2 = new NonTerminal("B2"),
                        MAIN = new NonTerminal("Main"), L1 = new NonTerminal("L1"), C1 = new NonTerminal("C1"), D1 = new NonTerminal("D1"),
                        IF = new NonTerminal("IF"), ElseIF = new NonTerminal("ELSEIF"), ELSE = new NonTerminal("ELSE"),
                        BARREGLO = new NonTerminal("BArreglo"), T_DATO1 = new NonTerminal("TipoDato");

            #endregion

            #region Gramaticas
            S.Rule = LISTACLASE;

            LISTACLASE.Rule = MakePlusRule(LISTACLASE, BLOCKCLASE);

            BLOCKCLASE.Rule = rclase + identifier + ToTerm("{") + LISTA_BLOQUE + ToTerm("}")                     //3 ya
                              | rclase + identifier + rimportar + LID + ToTerm("{") + LISTA_BLOQUE + ToTerm("}") //5 ya
                              | rclase + identifier + ToTerm("{") + ToTerm("}")                                  //2 ya
                              | rclase + identifier + rimportar + LID + ToTerm("{") + ToTerm("}");               //4 ya

            LISTA_BLOQUE.Rule = MakePlusRule(LISTA_BLOQUE, BLOQUE);


            BLOQUE.Rule = VISIBILIDAD + DECLARACION
                          | DECLARACION
                          | ASIGNACION
                          | VISIBILIDAD + METODOS
                          | METODOS
                          | MAIN
            ;

            MAIN.Rule = rmain + ToTerm("(") + ToTerm(")") + ToTerm("{") + INMETODO + ToTerm("}");

            METODOS.Rule = identifier + rvoid + OVERRIDE + ToTerm("(") + LPARAMETROS + ToTerm(")") + ToTerm("{") + INMETODO + ToTerm("}")                    //4 hijos
                           | identifier + rvoid + OVERRIDE + ToTerm("(") + ToTerm(")") + ToTerm("{") + INMETODO + ToTerm("}")                                //3 hijos

                           | identifier + T_DATO + OVERRIDE + ToTerm("(") + ToTerm(")") + ToTerm("{") + INMETODO + ToTerm("}")                               //3 hijos
                           | identifier + T_DATO + OVERRIDE + ToTerm("(") + LPARAMETROS + ToTerm(")") + ToTerm("{") + INMETODO + ToTerm("}")                 //4 hijos

                           | identifier + rarray + T_DATO + DIM + OVERRIDE + ToTerm("(") + ToTerm(")") + ToTerm("{") + INMETODO + ToTerm("}")                //5 hijos
                           | identifier + rarray + T_DATO + DIM + OVERRIDE + ToTerm("(") + LPARAMETROS + ToTerm(")") + ToTerm("{") + INMETODO + ToTerm("}"); //6 hijos

            OVERRIDE.Rule = roverride
                            | Empty;


            INMETODO.Rule = LISTAMSENTENCIA
                            | Empty;

            LISTAMSENTENCIA.Rule = MakePlusRule(LISTAMSENTENCIA, MSENTENCIA);

            MSENTENCIA.Rule = VISIBILIDAD + DECLARACION
                              | DECLARACION
                              | ASIGNACION
                              | BLOQUESHOW      //YA
                              | BLOQUEPRINT     //YA
                              | BLOQUEREPETIR   //YA
                              | BLOQUEWHILE     //YA
                              | BLOQUEIF        //YA
                              | BLOQUEHACER     //YA
                              | BLOQUEFOR       //YA
                              | BLOQUECOMPROBAR //YA
                              | ADDFIGURE       //YA
                              | FIGURE          //YA
                              | FUNCION + ToTerm(";")
                              | D1 + ToTerm(";")
                              | rcontinuar + ToTerm(";")   //YA
                              | rsalir + ToTerm(";")       //YA
                              | rreturn + E + ToTerm(";"); //YA


            BLOQUEIF.Rule = IF
                            | IF + ELSE
                            | IF + BLOQUEELSEIF
                            | IF + BLOQUEELSEIF + ELSE;

            IF.Rule = rif + ToTerm("(") + E + ToTerm(")") + ToTerm("{") + INMETODO + ToTerm("}");

            ELSE.Rule = relse + ToTerm("{") + INMETODO + ToTerm("}");

            ElseIF.Rule = relse + rif + ToTerm("(") + E + ToTerm(")") + ToTerm("{") + INMETODO + ToTerm("}");

            BLOQUEELSEIF.Rule = MakePlusRule(BLOQUEELSEIF, ElseIF);

            BLOQUEREPETIR.Rule = rrepeat + ToTerm("(") + E + ToTerm(")") + ToTerm("{") + INMETODO + ToTerm("}");

            BLOQUEWHILE.Rule = rwhile + ToTerm("(") + E + ToTerm(")") + ToTerm("{") + INMETODO + ToTerm("}");

            BLOQUEPRINT.Rule = rprint + ToTerm("(") + E + ToTerm(")") + ToTerm(";");

            BLOQUESHOW.Rule = rshow + ToTerm("(") + E + ToTerm(",") + E + ToTerm(")") + ToTerm(";")
                              | rshow + ToTerm("(") + E + ToTerm(")") + ToTerm(";");

            BLOQUEHACER.Rule = rhacer + ToTerm("{") + INMETODO + ToTerm("}") + rmientras + ToTerm("(") + E + ToTerm(")") + ToTerm(";");

            BLOQUEFOR.Rule = rfor + ToTerm("(") + T_DATO + identifier + igual + E + ToTerm(";") + E + ToTerm(";") + ASIGNACION + ToTerm(")") + ToTerm("{") + INMETODO + ToTerm("}")
                             | rfor + ToTerm("(") + identifier + igual + E + ToTerm(";") + E + ToTerm(";") + ASIGNACION + ToTerm(")") + ToTerm("{") + INMETODO + ToTerm("}");

            BLOQUECOMPROBAR.Rule = rcomprobar + ToTerm("(") + E + ToTerm(")") + ToTerm("{") + BLOQUECASO + ToTerm("}");

            BLOQUECASO.Rule = MakePlusRule(BLOQUECASO, C1);

            C1.Rule = rcaso + E + ToTerm(":") + INMETODO
                      | rdefecto + ToTerm(":") + INMETODO;

            FIGURE.Rule = rfigure + ToTerm("(") + E + ToTerm(")") + ToTerm(";");

            ADDFIGURE.Rule = raddfigure + ToTerm("(") + TFIGURE + ToTerm(")") + ToTerm(";");

            TFIGURE.Rule = rcircle + ToTerm("(") + E + ToTerm(",") + E + ToTerm(",") + E + ToTerm(",") + E + ToTerm(",") + E + ToTerm(")")
                           | rtriangle + ToTerm("(") + E + ToTerm(",") + E + ToTerm(",") + E + ToTerm(",") + E + ToTerm(",") + E + ToTerm(",") + E + ToTerm(",") + E + ToTerm(",") + E + ToTerm(")")
                           | rsquare + ToTerm("(") + E + ToTerm(",") + E + ToTerm(",") + E + ToTerm(",") + E + ToTerm(",") + E + ToTerm(",") + E + ToTerm(")")
                           | rline + ToTerm("(") + E + ToTerm(",") + E + ToTerm(",") + E + ToTerm(",") + E + ToTerm(",") + E + ToTerm(",") + E + ToTerm(")");

            DECLARACION.Rule = T_DATO + LID + ToTerm(";")
                               | identifier + identifier + ToTerm(";")
                               | T_DATO + LID + igual + E + ToTerm(";")
                               | T_DATO + rarray + LID + DIM + ToTerm(";")
                               | identifier + identifier + igual + rnew + identifier + ToTerm("(") + ToTerm(")") + ToTerm(";")
                               | identifier + identifier + igual + E + ToTerm(";")
                               | T_DATO + rarray + LID + DIM + igual + LDIM + ToTerm(";");



            ASIGNACION.Rule = identifier + igual + E + ToTerm(";")                                               //2 hijos ya
                              | identifier + igual + rnew + identifier + ToTerm("(") + ToTerm(")") + ToTerm(";") //3 hijos ya
                              | identifier + DIM + igual + E + ToTerm(";")                                       //3 hijos ya
                              | D1 + DIM + igual + E + ToTerm(";")
                              | D1 + DIM + aumento + ToTerm(";")
                              | D1 + DIM + decremento + ToTerm(";")

                              | identifier + DIM + aumento + ToTerm(";")
                              | identifier + DIM + decremento + ToTerm(";")

                              | identifier + aumento + ToTerm(";")    //2 hijos ya
                              | identifier + decremento + ToTerm(";") //2 hijos ya
                              | identifier + aumento
                              | identifier + decremento
                              | D1 + igual + E + ToTerm(";") //2 hijos pendiente
                              | D1 + aumento + ToTerm(";")
                              | D1 + decremento + ToTerm(";")
            ;

            LDIM.Rule = ToTerm("{") + DIM1 + ToTerm("}")
                        | ToTerm("{") + DIM2 + ToTerm("}")
                        | ToTerm("{") + DIM3 + ToTerm("}");


            DIM3.Rule = MakePlusRule(DIM3, ToTerm(","), B3);

            B3.Rule = ToTerm("{") + DIM2 + ToTerm("}");

            DIM2.Rule = MakePlusRule(DIM2, ToTerm(","), B2);

            B2.Rule = ToTerm("{") + DIM1 + ToTerm("}");

            DIM1.Rule = MakePlusRule(DIM1, ToTerm(","), E);

            LID.Rule = MakePlusRule(LID, ToTerm(","), identifier);

            LPARAMETROS.Rule = MakePlusRule(LPARAMETROS, ToTerm(","), L1);

            L1.Rule = T_DATO + identifier
                      | T_DATO + rarray + identifier + DIM;

            T_DATO.Rule = rint
                          | rchar
                          | rdouble
                          | rbool
                          | rstring
                          | identifier;

            T_DATO1.Rule = rint
                           | rchar
                           | rdouble
                           | rbool
                           | rstring;

            VISIBILIDAD.Rule = rprivado
                               | rpublico;

            DIM.Rule = ToTerm("[") + E + ToTerm("]")
                       | ToTerm("[") + E + ToTerm("]") + ToTerm("[") + E + ToTerm("]")
                       | ToTerm("[") + E + ToTerm("]") + ToTerm("[") + E + ToTerm("]") + ToTerm("[") + E + ToTerm("]");

            E.Rule = E + or + E
                     | E + and + E
                     | not + E

                     | E + mayor + E
                     | E + mayorigual + E
                     | E + menor + E
                     | E + menorigual + E
                     | E + igualLogico + E
                     | E + desigual + E

                     | E + mas + E
                     | E + menos + E
                     | E + por + E
                     | E + entre + E
                     | E + elevado + E

                     | menos + E
                     | D1 + aumento
                     | D1 + decremento

                     | dec
                     | rtrue
                     | rfalse
                     | StringLiteral
                     | CharLiteral
                     | num
                     | ToTerm("(") + E + ToTerm(")")
                     | D1
                     | BARREGLO
                     | BARREGLO + aumento
                     | BARREGLO + decremento;

            BARREGLO.Rule = D1 + ToTerm("[") + E + ToTerm("]")
                            | D1 + ToTerm("[") + E + ToTerm("]") + ToTerm("[") + E + ToTerm("]")
                            | D1 + ToTerm("[") + E + ToTerm("]") + ToTerm("[") + E + ToTerm("]") + ToTerm("[") + E + ToTerm("]");



            D1.Rule = MakePlusRule(D1, punto, identifier)
                      | MakePlusRule(D1, punto, FUNCION);

            FUNCION.Rule = identifier + ToTerm("(") + PARAMFUNCION + ToTerm(")")
                           | identifier + ToTerm("(") + ToTerm(")");

            PARAMFUNCION.Rule = MakePlusRule(PARAMFUNCION, ToTerm(","), E);


            #endregion

            #region Preferencias
            this.Root = S;
            this.MarkTransient(T_DATO, OVERRIDE, INMETODO, VISIBILIDAD, B2, B3);
            this.RegisterOperators(1, Associativity.Left, or);
            this.RegisterOperators(2, Associativity.Left, and);
            this.RegisterOperators(3, Associativity.Right, not);
            this.RegisterOperators(4, Associativity.Left, mayor, mayorigual, menor, menorigual, igualLogico, desigual);
            this.RegisterOperators(5, Associativity.Left, mas, menos);
            this.RegisterOperators(6, Associativity.Left, por, entre);
            this.RegisterOperators(7, Associativity.Left, elevado);
            this.RegisterOperators(8, Associativity.Left, aumento, decremento);
            this.MarkPunctuation("(", ")", ",", ";", ":", "[", "]", "{", "}", "=");

            #endregion
        }
        public EntropyGrammar() : base(false) // turns off case-sensitivity
        {
            #region definitions
            #region literals
            // Str
            StringLiteral stringLiteral = TerminalFactory.CreateCSharpString("StringLiteral");
            // Char
            StringLiteral charLiteral = TerminalFactory.CreateCSharpChar("CharLiteral");
            // Real
            NumberLiteral number = CreateRealNumber("Number");
            #endregion


            #region non-terminals
            NonTerminal program = new NonTerminal("program"); //, typeof(ProgramNode));
            this.Root = program;                              // specify the non-terminal which is the root of the AST

            NonTerminal programDeclaration = new NonTerminal("programDeclaration");

            NonTerminal statementList  = new NonTerminal("statementList"); //, typeof(StatementListNode));
            NonTerminal emptyStatement = new NonTerminal("emptyStatement");
            NonTerminal statement      = new NonTerminal("statement");     //, typeof(StatementNode));

            NonTerminal printStatement           = new NonTerminal("printStatement");
            NonTerminal ifStatement              = new NonTerminal("ifStatement");    //, typeof(IfStatementNode));
            NonTerminal whileLoop                = new NonTerminal("whileLoop");
            NonTerminal expression               = new NonTerminal("expression");     //, typeof(ExpressionNode));
            NonTerminal binaryOperator           = new NonTerminal("binaryOperator"); //, typeof(BinaryOperatorNode));
            NonTerminal assignment               = new NonTerminal("assignmentOperator");
            NonTerminal localVariableDeclaration = new NonTerminal("localVariableDeclaration");
            NonTerminal conditionalExpression    = new NonTerminal("conditionalExpression");
            NonTerminal functionDeclaration      = new NonTerminal("functionDeclaration");
            #endregion


            #region terminals
            CommentTerminal singleLineComment = new CommentTerminal("SingleLineComment", "//", "\r", "\n", "\u2085", "\u2028", "\u2029");
            NonGrammarTerminals.Add(singleLineComment);
            CommentTerminal delimitedComment = new CommentTerminal("DelimitedComment", "/*", "*/");
            NonGrammarTerminals.Add(delimitedComment);

            IdentifierTerminal variable_id   = TerminalFactory.CreateCSharpIdentifier("variable_id");
            IdentifierTerminal namespace_id  = TerminalFactory.CreateCSharpIdentifier("namespace_id");
            IdentifierTerminal function_id   = TerminalFactory.CreateCSharpIdentifier("function_id");
            IdentifierTerminal program_id    = TerminalFactory.CreateCSharpIdentifier("program_id");
            IdentifierTerminal identifier_id = CreateCSharpIdentifier("identifier_id");
            NonTerminal        datatype      = new NonTerminal("datatype");
            //identifierTerminal.("set", "to", "if", "freight", "cost", "is", "loop", "through", "order");

            this.MarkPunctuation(";", "[", "]", "(", ")");
            #endregion
            #endregion

            #region grammar

            //<Program> ::= "Program" <ProgramName> <StatementList> <FunctionList> "End" "Program"
            programDeclaration.Rule = ToTerm("Program") + namespace_id + program_id + "[" + statementList + "]";
            program.Rule            = programDeclaration; // +Symbol("End") + Symbol("Program");

            datatype.Rule = ToTerm("char") | "real" | "string";

            #region statements
            //<StatementList> ::= <Statement>*
            statementList.Rule = MakeStarRule(statementList, null, statement);

            statement.Rule = emptyStatement | printStatement | ifStatement
                             | whileLoop
                             | localVariableDeclaration | assignment;

            emptyStatement.Rule = ToTerm(";"); //setVariable + ";" | ifStatement | orderLoop | expression + ";";

//            printStatement.Rule = ToTerm("print") + (stringLiteral | charLiteral) + ";";
            printStatement.Rule = ToTerm("print") + expression + ";";

            //<IfStatement> ::= "if" <Expression> "[" <StatementList> "]"
            ifStatement.Rule = ToTerm("if") + expression + "[" + statementList + "]";
            whileLoop.Rule   = ToTerm("while") + expression + "[" + statementList + "]";

            assignment.Rule = "let" + identifier_id + (ToTerm("=") | "+=" | "-=" | "*=" | "/=" | "%=" | "&=" | "|=" | "^=" | "<<=" | ">>=") + expression + ";";

            //functionDeclaration.Rule = "function" + identifier_id + "(" +

            localVariableDeclaration.Rule = ToTerm("declare") + identifier_id + datatype + ";"; // identifier_id
            #endregion


            #region expressions

            //<Expression> ::= <number> | <variable> | <string>
            //  | <Expression> <BinaryOperator> <Expression>
            //  | "(" <Expression> ")"
            expression.Rule = number | variable_id | stringLiteral | charLiteral
                              | expression + binaryOperator + expression
                              | conditionalExpression
                              | "(" + expression + ")";

            //<BinaryOperator> ::= "+" | "-" | "*" | "/" | "<" | ">" | "<=" | ">=" | "is"
            binaryOperator.Rule = ToTerm("+") | "-" | "*" | "/" | "%";

            // "=="
            conditionalExpression.Rule = expression + (ToTerm("<") | ">" | "<=" | ">=") + expression;

            #endregion
            #endregion
        }
Exemple #11
0
        public GramaticaPython()
            : base(caseSensitive: false)
        {
            #region expresiones regulares

            var           identificador = TerminalFactory.CreateCSharpIdentifier("identificador");
            var           numero        = TerminalFactory.CreateCSharpNumber("numero");
            var           val_false     = Constantes.falso;
            var           val_true      = Constantes.verdadero;
            StringLiteral cadena        = new StringLiteral("cadena", "\"");
            var           caracter      = TerminalFactory.CreateCSharpChar(Constantes.caracter);

            CommentTerminal COMENT_BLOQUE = new CommentTerminal("COMENTARIO BLOQUE", "/*", "*/");
            CommentTerminal COMENT_LINEA  = new CommentTerminal("COMENTARIO LINEA", "//", "\n", "\r\n");
            NonGrammarTerminals.Add(COMENT_BLOQUE);
            NonGrammarTerminals.Add(COMENT_LINEA);

            #endregion

            NonTerminal EXPRESION   = new NonTerminal(Constantes.expresion);
            NonTerminal DECIMAL     = new NonTerminal(Constantes.tipoDecimal);
            NonTerminal ENTERO      = new NonTerminal(Constantes.tipoEntero);
            NonTerminal CADENA      = new NonTerminal(Constantes.tipoCadena);
            NonTerminal CHAR        = new NonTerminal(Constantes.tipoChar);
            NonTerminal BOOLEANO    = new NonTerminal(Constantes.tipoBool);
            NonTerminal SIMB_ARIT   = new NonTerminal(Constantes.simb_arit);
            NonTerminal SIMB_REL    = new NonTerminal(Constantes.simb_rel);
            NonTerminal UNARIO      = new NonTerminal(Constantes.unario);
            NonTerminal ID          = new NonTerminal(Constantes.id);
            NonTerminal NEGATIVO    = new NonTerminal(Constantes.negativo);
            NonTerminal RELACIONAL  = new NonTerminal(Constantes.relacional);
            NonTerminal ARITMETICA  = new NonTerminal(Constantes.aritmetica);
            NonTerminal LOGICA      = new NonTerminal(Constantes.logica);
            NonTerminal LLAMADA     = new NonTerminal(Constantes.llamada);
            NonTerminal POSVECTOR   = new NonTerminal(Constantes.posvector);
            NonTerminal LISTAPUNTOS = new NonTerminal(Constantes.listapuntos);
            NonTerminal SIMB_LOG    = new NonTerminal(Constantes.simb_log);
            NonTerminal MAS_MAS     = new NonTerminal(Constantes.masmas);
            NonTerminal MENOS_MENOS = new NonTerminal(Constantes.menosmenos);
            NonTerminal ASIG_ARRAY  = new NonTerminal(Constantes.asig_array);
            NonTerminal termino     = new NonTerminal(Constantes.termino);

            NonTerminal L_IDS          = new NonTerminal(Constantes.listaIds);
            NonTerminal SUMA           = new NonTerminal(Constantes.suma);
            NonTerminal RESTA          = new NonTerminal(Constantes.resta);
            NonTerminal MULTIPLICACION = new NonTerminal(Constantes.multiplicacion);
            NonTerminal DIVISION       = new NonTerminal(Constantes.division);
            NonTerminal POTENCIA       = new NonTerminal(Constantes.potencia);
            NonTerminal MENOR          = new NonTerminal(Constantes.menor);
            NonTerminal MENORIGUAL     = new NonTerminal(Constantes.menorIgual);
            NonTerminal MAYOR          = new NonTerminal(Constantes.mayor);
            NonTerminal MAYORIGUAL     = new NonTerminal(Constantes.mayorIgual);
            NonTerminal IGUALIGUAL     = new NonTerminal(Constantes.igualIgual);
            NonTerminal DISTINTOA      = new NonTerminal(Constantes.distintoA);
            NonTerminal XOR            = new NonTerminal(Constantes.xorJava);
            NonTerminal AND            = new NonTerminal(Constantes.andJava);
            NonTerminal NOT            = new NonTerminal(Constantes.notJavaPython);
            NonTerminal OR             = new NonTerminal(Constantes.orJava);
            NonTerminal INSTANCIA      = new NonTerminal(Constantes.instancia);
            NonTerminal POSICION       = new NonTerminal(Constantes.posicion);
            NonTerminal FILA           = new NonTerminal(Constantes.fila);
            NonTerminal LPOSICIONES    = new NonTerminal(Constantes.lposiciones);
            NonTerminal LEXPRESIONES   = new NonTerminal(Constantes.lexpresiones);
            NonTerminal LFILAS         = new NonTerminal(Constantes.lfilas);


            #region expresion


            POSICION.Rule = ToTerm("[") + EXPRESION + "]";

            LPOSICIONES.Rule = MakePlusRule(LPOSICIONES, POSICION);

            FILA.Rule = ToTerm("{") + LEXPRESIONES + "}";

            LEXPRESIONES.Rule = MakePlusRule(LEXPRESIONES, ToTerm(","), EXPRESION);

            LFILAS.Rule = MakePlusRule(LFILAS, ToTerm(","), FILA);

            DECIMAL.Rule  = numero;
            ENTERO.Rule   = numero;
            CADENA.Rule   = cadena;
            ID.Rule       = identificador;
            CHAR.Rule     = caracter;
            BOOLEANO.Rule = ToTerm(val_false)
                            | ToTerm(val_true);



            ARITMETICA.Rule = SUMA
                              | RESTA
                              | MULTIPLICACION
                              | DIVISION
                              | POTENCIA;

            RELACIONAL.Rule = MENOR
                              | MAYOR
                              | MENORIGUAL
                              | MAYORIGUAL
                              | DISTINTOA
                              | IGUALIGUAL;

            LOGICA.Rule = XOR
                          | OR
                          | AND
                          | NOT;



            SUMA.Rule           = EXPRESION + ToTerm(Constantes.suma) + EXPRESION;
            RESTA.Rule          = EXPRESION + ToTerm(Constantes.resta) + EXPRESION;
            MULTIPLICACION.Rule = EXPRESION + ToTerm(Constantes.multiplicacion) + EXPRESION;
            DIVISION.Rule       = EXPRESION + ToTerm(Constantes.division) + EXPRESION;
            POTENCIA.Rule       = EXPRESION + ToTerm(Constantes.potencia) + EXPRESION;
            MENOR.Rule          = EXPRESION + ToTerm(Constantes.menor) + EXPRESION;
            MENORIGUAL.Rule     = EXPRESION + ToTerm(Constantes.menorIgual) + EXPRESION;
            MAYOR.Rule          = EXPRESION + ToTerm(Constantes.mayor) + EXPRESION;
            MAYORIGUAL.Rule     = EXPRESION + ToTerm(Constantes.mayorIgual) + EXPRESION;
            IGUALIGUAL.Rule     = EXPRESION + ToTerm(Constantes.igualIgual) + EXPRESION;
            DISTINTOA.Rule      = EXPRESION + ToTerm(Constantes.distintoA) + EXPRESION;
            XOR.Rule            = EXPRESION + ToTerm(Constantes.xorJava) + EXPRESION;
            AND.Rule            = EXPRESION + ToTerm(Constantes.andJava) + EXPRESION;
            NOT.Rule            = ToTerm(Constantes.notJavaPython) + EXPRESION;
            OR.Rule             = EXPRESION + ToTerm(Constantes.orJava) + EXPRESION;
            INSTANCIA.Rule      = Constantes.nuevo + identificador + "(" + LEXPRESIONES + ")"
                                  | Constantes.nuevo + identificador + "(" + ")";

            UNARIO.Rule = MAS_MAS
                          | MENOS_MENOS;

            MAS_MAS.Rule = identificador + ToTerm(Constantes.masmas);

            MENOS_MENOS.Rule = identificador + ToTerm(Constantes.menosmenos);


            NEGATIVO.Rule = ToTerm("-") + EXPRESION;

            termino.Rule = //ARITMETICA
                           //| RELACIONAL
                           // | LOGICA
                           DECIMAL
                           | ENTERO
                           | ID
                           | CADENA
                           | BOOLEANO
                           | CHAR;
            //| LLAMADA
            //| POSVECTOR
            //| UNARIO
            //| ToTerm("(") + EXPRESION + ")"
            //| NEGATIVO
            //| "{" + LFILAS + "}"
            //| INSTANCIA;

            LLAMADA.Rule = identificador + ToTerm("(") + LEXPRESIONES + ")"
                           | identificador + ToTerm("(") + ")";


            POSVECTOR.Rule = identificador + LPOSICIONES;

            L_IDS.Rule = MakePlusRule(L_IDS, ToTerm(","), identificador);



            EXPRESION.Rule = MakePlusRule(EXPRESION, ToTerm("."), termino);



            NonTerminal n = new NonTerminal("fdsfd");
            n.Rule = EXPRESION;



            #endregion


            Root = n;
        }
Exemple #12
0
        public SLAngGrammer()
            : base()
        {
            StringLiteral      stringLiteral     = TerminalFactory.CreateCSharpString("StringLiteral");
            StringLiteral      charLiteral       = TerminalFactory.CreateCSharpChar("CharLiteral");
            NumberLiteral      number            = TerminalFactory.CreateCSharpNumber("Number");
            IdentifierTerminal identifier        = TerminalFactory.CreateCSharpIdentifier("Identifier");
            CommentTerminal    delimitedComment  = new CommentTerminal("DelimitedComment", "/[", "]/");
            CommentTerminal    SingleLineComment = new CommentTerminal("SingleLineComment", "--", "\r", "\n", "\u2085", "\u2028", "\u2029");

            NonGrammarTerminals.Add(SingleLineComment);
            NonGrammarTerminals.Add(delimitedComment);

            #region Terminals
            KeyTerm colon      = ToTerm(":");
            KeyTerm dot        = ToTerm(".");
            KeyTerm comma      = ToTerm(",");
            KeyTerm propertyIs = ToTerm("->");
            KeyTerm lbr        = ToTerm("{");
            KeyTerm rbr        = ToTerm("}");
            KeyTerm lpar       = ToTerm("(");
            KeyTerm rpar       = ToTerm(")");
            KeyTerm scopeIn    = ToTerm("::");
            KeyTerm suchThat   = ToTerm("|");
            KeyTerm _package   = ToTerm("package");
            KeyTerm context    = ToTerm("context");
            KeyTerm body       = ToTerm("body");
            KeyTerm def        = ToTerm("def");
            KeyTerm derive     = ToTerm("derive");
            KeyTerm In         = ToTerm("in");
            KeyTerm inv        = ToTerm("inv");
            KeyTerm let        = ToTerm("let");
            KeyTerm post       = ToTerm("post");
            KeyTerm pre        = ToTerm("pre");
            KeyTerm Static     = ToTerm("static");
            KeyTerm self       = ToTerm("self");
            KeyTerm result     = ToTerm("result");
            KeyTerm equalsTo   = ToTerm("=");
            KeyTerm _null      = ToTerm("null");
            KeyTerm invalid    = ToTerm("invalid");
            KeyTerm not        = ToTerm("not");
            KeyTerm and        = ToTerm("and");
            KeyTerm or         = ToTerm("or");
            KeyTerm xor        = ToTerm("xor");
            #endregion

            #region NonTerminal
            var specification       = new NonTerminal("specification");
            var specificationBody   = new NonTerminal("specificationBody");
            var package             = new NonTerminal("package");
            var packages            = new NonTerminal("packages");
            var oclPackage          = new NonTerminal("oclPackage");
            var emofOclPackage      = new NonTerminal("emofOclPackage");
            var packageBody         = new NonTerminal("packageBody");
            var packageBodyItem     = new NonTerminal("packageBodyItem");
            var contextExp          = new NonTerminal("contextExp");
            var classType           = new NonTerminal("classType");
            var enumeration         = new NonTerminal("enumeration");
            var primitive           = new NonTerminal("primitive");
            var primitiveType       = new NonTerminal("primitiveType");
            var primitiveTypes      = new NonTerminal("primitiveTypes");
            var delimitedIdentifier = new NonTerminal("delimitedIdentifier");
            var classSignature      = new NonTerminal("classSignature");
            var classBody           = new NonTerminal("classBody");
            var classBodyItem       = new NonTerminal("classBodyItem");
            var invExp                   = new NonTerminal("invExp");
            var functionDefination       = new NonTerminal("functionDefination");
            var attributeDiclaration     = new NonTerminal("attributeDiclaration");
            var emofAttributeDiclaration = new NonTerminal("emofAttributeDiclaration");
            var oclAttributeDiclaration  = new NonTerminal("oclAttributeDiclaration");
            var type                        = new NonTerminal("type");
            var expression                  = new NonTerminal("expression");
            var customType                  = new NonTerminal("customType");
            var collectionTpye              = new NonTerminal("collectionTpye");
            var fullType                    = new NonTerminal("fullType");
            var globalType                  = new NonTerminal("globalType");
            var setType                     = new NonTerminal("setType");
            var orderedSetType              = new NonTerminal("orderedSetType");
            var sequenceType                = new NonTerminal("sequenceType");
            var bagType                     = new NonTerminal("bagType");
            var functionSignature           = new NonTerminal("functionSignature");
            var functionSignatureBody       = new NonTerminal("functionSignatureBody");
            var functionBody                = new NonTerminal("functionBody");
            var oclFunctionSignature        = new NonTerminal("oclFunctionSignature");
            var emofFunctionSignature       = new NonTerminal("emofFunctionSignature");
            var argumentList                = new NonTerminal("argumentList");
            var variableDiclaration         = new NonTerminal("variableDiclaration");
            var emofFunctionBody            = new NonTerminal("emofFunctionBody");
            var oclFunctionBody             = new NonTerminal("oclFunctionBody");
            var singleValueCollectionMember = new NonTerminal("singleValueCollectionMember");
            var booleanValueCollection      = new NonTerminal("booleanValueCollection");
            var letExp                      = new NonTerminal("letExp");
            var ifThenElseExp               = new NonTerminal("ifThenElseExp");
            var collectionValueExp          = new NonTerminal("collectionValueExp");
            var sum                        = new NonTerminal("sum");
            var size                       = new NonTerminal("size");
            var first                      = new NonTerminal("first");
            var last                       = new NonTerminal("last");
            var at                         = new NonTerminal("at");
            var indexOf                    = new NonTerminal("indexOf");
            var countOperation             = new NonTerminal("countOperation");
            var maxOperation               = new NonTerminal("maxOperation");
            var minOperation               = new NonTerminal("minOperation");
            var valueExp                   = new NonTerminal("valueExp");
            var includesOperation          = new NonTerminal("includesOperation");
            var includesAllOperation       = new NonTerminal("includesAllOperation");
            var excludesOperation          = new NonTerminal("excludesOperation");
            var excludesAllOperation       = new NonTerminal("excludesAllOperation");
            var isEmptyOperation           = new NonTerminal("isEmptyOperation");
            var notEmptyOperation          = new NonTerminal("notEmptyOperation");
            var specialIteratorBodyExp     = new NonTerminal("specialIteratorBodyExp");
            var existsExp                  = new NonTerminal("existsExp");
            var forAllExp                  = new NonTerminal("forAllExp");
            var isUniqueExp                = new NonTerminal("isUniqueExp");
            var anyExp                     = new NonTerminal("anyExp");
            var oneExp                     = new NonTerminal("oneExp");
            var selectExp                  = new NonTerminal("selectExp");
            var includingOperation         = new NonTerminal("includingOperation");
            var excludingOperation         = new NonTerminal("excludingOperation");
            var collect                    = new NonTerminal("collect");
            var subOrderedSet              = new NonTerminal("subOrderedSet");
            var symmetricDifference        = new NonTerminal("symmetricDifference");
            var prepend                    = new NonTerminal("prepend");
            var append                     = new NonTerminal("append");
            var insertAt                   = new NonTerminal("insertAt");
            var intersection               = new NonTerminal("intersection");
            var union                      = new NonTerminal("union");
            var asBag                      = new NonTerminal("asBag");
            var asSequence                 = new NonTerminal("asSequence");
            var asOrderdSet                = new NonTerminal("asOrderdSet");
            var asSet                      = new NonTerminal("asSet");
            var flatten                    = new NonTerminal("flatten");
            var subSequence                = new NonTerminal("subSequence");
            var andExp                     = new NonTerminal("andExp");
            var orExp                      = new NonTerminal("orExp");
            var notExp                     = new NonTerminal("notExp");
            var xorExp                     = new NonTerminal("xorExp");
            var impliesExp                 = new NonTerminal("impliesExp");
            var comparisonOperator         = new NonTerminal("comparisonOperator");
            var arithmaticOperator         = new NonTerminal("arithmaticOperator");
            var oclInvExp                  = new NonTerminal("oclInvExp");
            var emofInvExp                 = new NonTerminal("emofInvExp");
            var operationContextExp        = new NonTerminal("operationContextExp");
            var attributeContextExp        = new NonTerminal("attributeContextExp");
            var classContextExp            = new NonTerminal("classContextExp");
            var classContextSignature      = new NonTerminal("classContextSignature");
            var attributeContextbody       = new NonTerminal("attributeContextbody");
            var attributeContextbodyItem   = new NonTerminal("attributeContextbodyItem");
            var deriveExp                  = new NonTerminal("deriveExp");
            var initExp                    = new NonTerminal("initExp");
            var operationContextBodyExps   = new NonTerminal("operationContextBodyExps");
            var operationContextSignature  = new NonTerminal("operationContextSignature");
            var operationContextBodyItem   = new NonTerminal("operationContextBodyItem");
            var preCondition               = new NonTerminal("preCondition");
            var postCondition              = new NonTerminal("postCondition");
            var bodyExp                    = new NonTerminal("bodyExp");
            var iterateExp                 = new NonTerminal("iterateExp");
            var productExp                 = new NonTerminal("productExp");
            var tupleExp                   = new NonTerminal("tupleExp");
            var rejectExp                  = new NonTerminal("rejectExp");
            var collection                 = new NonTerminal("collection");
            var tuplElementList            = new NonTerminal("tuplElementList");
            var tupleElement               = new NonTerminal("tupleElement");
            var binaryOperator             = new NonTerminal("binaryOperator");
            var parameterList              = new NonTerminal("parameterList");
            var structuralExp              = new NonTerminal("structuralExp");
            var setLiteral                 = new NonTerminal("setLiteral");
            var bagLiteral                 = new NonTerminal("orderedSetLiteral");
            var orderedSetLiteral          = new NonTerminal("");
            var sequenceLiteral            = new NonTerminal("sequenceLiteral");
            var tupleLiteral               = new NonTerminal("tupleLiteral");
            var literalList                = new NonTerminal("literalList");
            var iteratorList               = new NonTerminal("iteratorList");
            var iteratorInitializationList = new NonTerminal("iteratorInitializationList");
            var iteratorInitialization     = new NonTerminal("iteratorInitialization");
            var collectionValue            = new NonTerminal("collectionValue");
            var ArrayType                  = new NonTerminal("ArrayType");
            var binaryBooleanOperator      = new NonTerminal("binaryBooleanOperator");
            var oclIsTypeOf                = new NonTerminal("oclIsTypeOf");
            var ValueExp                   = new NonTerminal("ValueExp");
            var unValueExp                 = new NonTerminal("unValueExp");
            var instanceMemberAccess       = new NonTerminal("instanceMemberAccess");
            var instanceMathodAccess       = new NonTerminal("instanceMathodAccess");
            #endregion

            #region Rules

            #region specification
            specification.Rule     = "specification" + identifier + lbr + specificationBody + rbr;
            specificationBody.Rule = MakePlusRule(packages, package);
            #endregion

            #region package
            package.Rule         = oclPackage | emofOclPackage;
            oclPackage.Rule      = _package + identifier + packageBody + "endpackage";
            emofOclPackage.Rule  = _package + identifier + lbr + packageBody + rbr;
            packageBody.Rule     = MakeStarRule(packageBody, null, packageBodyItem);
            packageBodyItem.Rule = primitive | enumeration | classType | contextExp | package;
            #endregion

            #region primitive
            primitive.Rule      = "primitive" + primitiveTypes + identifier + "IDENTICAL";
            primitiveTypes.Rule = ToTerm("Real") | ToTerm("Integer") | ToTerm("String") | ToTerm("Boolean");
            #endregion

            #region enumeration
            enumeration.Rule         = "enumeration" + identifier + lbr + delimitedIdentifier + rbr;
            delimitedIdentifier.Rule = MakePlusRule(delimitedIdentifier, comma, identifier);
            #endregion

            #region class
            classType.Rule      = classSignature + lbr + classBody + rbr;
            classSignature.Rule = ToTerm("class") + identifier
                                  | ToTerm("abstract") + ToTerm("class") + identifier
                                  | ToTerm("abstract") + ToTerm("class") + identifier + ToTerm("extends") + identifier
                                  | ToTerm("class") + identifier + ToTerm("extends") + type;
            classBody.Rule     = MakeStarRule(classBody, classBodyItem);
            classBodyItem.Rule = attributeDiclaration | functionDefination | invExp;
            #endregion

            #region attribute
            attributeDiclaration.Rule    = oclAttributeDiclaration | emofAttributeDiclaration;
            oclAttributeDiclaration.Rule = def + colon + identifier + type + ReduceHere()
                                           | def + colon + identifier + type + PreferShiftHere() + equalsTo + expression + ReduceHere()
                                           | def + colon + "attr" + identifier + type + PreferShiftHere() + equalsTo + expression + ReduceHere()
                                           | def + colon + "attr" + identifier + type + ReduceHere();
            emofAttributeDiclaration.Rule = identifier + colon + type + ReduceHere()
                                            | ToTerm("component") + identifier + colon + type + ToTerm("opposite") + identifier + ReduceHere()
                                            | ToTerm("component") + identifier + colon + type + ToTerm("unique") + ToTerm("opposite") + identifier + ReduceHere()
                                            | identifier + colon + type + equalsTo + expression + ReduceHere()
                                            | identifier + colon + type + ToTerm("opposite") + identifier + ReduceHere()
                                            | identifier + colon + type + ToTerm("unique") + ToTerm("opposite") + identifier + ReduceHere()
                                            | identifier + colon + type + ToTerm("unique") + ReduceHere();
            #endregion

            #region type
            type.Rule       = primitiveTypes | customType;
            customType.Rule = fullType | globalType | ArrayType | collectionTpye | tupleExp;
            fullType.Rule   = identifier + scopeIn + fullType | identifier + ReduceHere();
            globalType.Rule = PreferShiftHere() + scopeIn + fullType
                              | PreferShiftHere() + scopeIn + ArrayType;
            ArrayType.Rule = fullType + "[" + "*" + "]"
                             | fullType + "[" + identifier + "]"
                             | fullType + "[" + number + "]"
                             | fullType + "[" + number + comma + number + "]"
                             | fullType + "[" + number + comma + "*" + "]";
            collectionTpye.Rule = setType | orderedSetType | sequenceType | bagType | collection;
            setType.Rule        = "Set(" + customType + ")";
            orderedSetType.Rule = "OrderedSet(" + customType + ")";
            sequenceType.Rule   = "Sequence(" + customType + ")";
            bagType.Rule        = "Bag(" + customType + ")";
            collection.Rule     = "Collection(" + customType + ")";
            tupleExp.Rule       = "Tuple" + lbr + argumentList + rbr;
            #endregion

            #region function
            functionDefination.Rule    = functionSignature + functionBody;
            functionSignature.Rule     = oclFunctionSignature | emofFunctionSignature;
            oclFunctionSignature.Rule  = def + colon + functionSignatureBody;
            functionSignatureBody.Rule = identifier + lpar + argumentList + rpar + colon + type
                                         | identifier + lpar + argumentList + rpar + colon + type + ToTerm("ordered") + ToTerm("unique")
                                         | identifier + lpar + argumentList + rpar + colon;
            argumentList.Rule          = MakeStarRule(argumentList, comma, variableDiclaration);
            variableDiclaration.Rule   = identifier + PreferShiftHere() + colon + type;
            emofFunctionSignature.Rule = functionSignatureBody;
            functionBody.Rule          = oclFunctionBody | emofFunctionBody;
            oclFunctionBody.Rule       = equalsTo + expression;
            emofFunctionBody.Rule      = equalsTo + lbr + expression + rbr;
            #endregion

            #region expression
            expression.Rule = valueExp | structuralExp;
            #endregion

            #region valueExp
            valueExp.Rule = // ValueExp + ReduceHere() |
                            unValueExp + ReduceHere()
                            | valueExp + PreferShiftHere() + binaryOperator + valueExp
                            | ToTerm("not") + valueExp
                            | lpar + valueExp + rpar;
            #endregion

            #region unValueExp

            unValueExp.Rule = booleanValueCollection
                              | ToTerm("false") | ToTerm("true")
                              | collectionValue
                              | tupleLiteral
                              | singleValueCollectionMember
                              | collectionValueExp
                              | iterateExp
                              | stringLiteral
                              | charLiteral
                              | number
                              | self
                              | oclIsTypeOf
                              | unValueExp + lpar + parameterList + rpar
                              | instanceMemberAccess
                              | instanceMathodAccess
                              | ToTerm("-") + number;
            #endregion

            #region ValueExp
            ValueExp.Rule = fullType + dot + instanceMemberAccess
                            | globalType + dot + instanceMemberAccess
                            | ValueExp + dot + identifier + lpar + parameterList + rpar;
            #endregion

            #region instanceMemberAccess
            instanceMemberAccess.Rule = MakePlusRule(instanceMemberAccess, dot, identifier);
            instanceMathodAccess.Rule = unValueExp + dot + identifier + lpar + parameterList + rpar;
            #endregion

            #region parameterList
            parameterList.Rule = MakeStarRule(parameterList, comma, expression);
            #endregion

            #region booleanExp
            booleanValueCollection.Rule = includesOperation | includesAllOperation | excludesOperation | excludesAllOperation
                                          | isEmptyOperation | notEmptyOperation | existsExp | forAllExp | isUniqueExp | anyExp | oneExp;
            #endregion

            #region oclBuildInMethods
            oclIsTypeOf.Rule = valueExp + dot + ToTerm("oclIsTypeOf") + lpar + type + rpar;
            #endregion

            #region binaryOperator

            binaryOperator.Rule        = comparisonOperator | arithmaticOperator | binaryBooleanOperator;
            arithmaticOperator.Rule    = ToTerm("/") | ToTerm("div") | ToTerm("*") | ToTerm("+") | ToTerm("-");
            comparisonOperator.Rule    = ToTerm(">") | ToTerm("<") | ToTerm(">=") | ToTerm("<=") | ToTerm("<>") | equalsTo;
            binaryBooleanOperator.Rule = ToTerm("and") | ToTerm("or") | ToTerm("xor") | ToTerm("implies");

            #endregion

            #region booleanValueCollection
            includesOperation.Rule    = valueExp + PreferShiftHere() + propertyIs + ToTerm("includes") + lpar + valueExp + rpar;
            includesAllOperation.Rule = valueExp + PreferShiftHere() + propertyIs + ToTerm("includesAll") + lpar + identifier + rpar;
            excludesOperation.Rule    = valueExp + PreferShiftHere() + propertyIs + ToTerm("excludes") + lpar + identifier + rpar;
            excludesAllOperation.Rule = valueExp + PreferShiftHere() + propertyIs + ToTerm("excludesAll") + lpar + identifier + rpar;
            isEmptyOperation.Rule     = valueExp + PreferShiftHere() + propertyIs + ToTerm("isEmpty") + lpar + rpar;
            notEmptyOperation.Rule    = valueExp + PreferShiftHere() + propertyIs + ToTerm("notEmpty") + lpar + rpar;
            existsExp.Rule            = valueExp + PreferShiftHere() + propertyIs + ToTerm("exists") + lpar + specialIteratorBodyExp + rpar;
            forAllExp.Rule            = valueExp + PreferShiftHere() + propertyIs + ToTerm("forAll") + lpar + specialIteratorBodyExp + rpar;
            isUniqueExp.Rule          = valueExp + PreferShiftHere() + propertyIs + ToTerm("isUnique") + lpar + specialIteratorBodyExp + rpar;
            anyExp.Rule = valueExp + PreferShiftHere() + propertyIs + ToTerm("any") + lpar + specialIteratorBodyExp + rpar;
            oneExp.Rule = valueExp + PreferShiftHere() + propertyIs + ToTerm("one") + lpar + specialIteratorBodyExp + rpar;
            specialIteratorBodyExp.Rule = delimitedIdentifier + colon + type + suchThat + valueExp
                                          | argumentList + suchThat + valueExp
                                          | valueExp;
            #endregion

            #region collectionValue
            collectionValue.Rule = setLiteral | bagLiteral | orderedSetLiteral | sequenceLiteral;
            setLiteral.Rule      = "Set" + lbr + literalList + rbr
                                   | "Set" + lpar + type + rpar + lbr + literalList + rbr;
            bagLiteral.Rule = "Bag" + lbr + literalList + rbr
                              | "Bag" + lpar + type + rpar + lbr + literalList + rbr;
            orderedSetLiteral.Rule = "OrderedSet" + lbr + literalList + rbr
                                     | "OrderedSet" + lpar + type + rpar + lbr + literalList + rbr;
            sequenceLiteral.Rule = "Sequence" + lbr + literalList + rbr
                                   | "Sequence" + lpar + type + rpar + lbr + literalList + rbr;
            literalList.Rule        = MakeStarRule(literalList, comma, valueExp);
            tupleLiteral.Rule       = "Tuple" + lbr + tuplElementList + rbr;
            tuplElementList.Rule    = MakePlusRule(tuplElementList, comma, tupleElement);
            tupleElement.Rule       = variableDiclaration + equalsTo + valueExp | identifier + equalsTo + valueExp;
            collectionValueExp.Rule = includingOperation | excludingOperation | selectExp | rejectExp
                                      | union | intersection | insertAt | append | prepend | symmetricDifference | subOrderedSet | collect | productExp
                                      | subSequence | flatten | asSet | asOrderdSet | asSequence | asBag;
            includingOperation.Rule = valueExp + PreferShiftHere() + propertyIs + ToTerm("including") + lpar + identifier + rpar;
            excludingOperation.Rule = valueExp + PreferShiftHere() + propertyIs + ToTerm("excluding") + lpar + identifier + rpar;
            selectExp.Rule          = valueExp + PreferShiftHere() + propertyIs + ToTerm("select") + lpar + specialIteratorBodyExp + rpar;
            rejectExp.Rule          = valueExp + PreferShiftHere() + propertyIs + ToTerm("reject") + lpar + specialIteratorBodyExp + rpar;
            union.Rule               = valueExp + PreferShiftHere() + propertyIs + ToTerm("union") + lpar + valueExp + rpar;
            intersection.Rule        = valueExp + PreferShiftHere() + propertyIs + ToTerm("intersection") + lpar + identifier + rpar;
            insertAt.Rule            = valueExp + PreferShiftHere() + propertyIs + ToTerm("insertAt") + lpar + number + comma + identifier + rpar;
            append.Rule              = valueExp + PreferShiftHere() + propertyIs + ToTerm("append") + lpar + identifier + rpar;
            prepend.Rule             = valueExp + PreferShiftHere() + propertyIs + ToTerm("prepend") + lpar + identifier + rpar;
            symmetricDifference.Rule = valueExp + PreferShiftHere() + propertyIs + ToTerm("symmetricDifference") + lpar + identifier + rpar;
            subOrderedSet.Rule       = valueExp + PreferShiftHere() + propertyIs + ToTerm("subOrderedSet") + lpar + number + comma + number + rpar;
            collect.Rule             = valueExp + PreferShiftHere() + propertyIs + ToTerm("collect") + lpar + specialIteratorBodyExp + rpar
                                       | valueExp + PreferShiftHere() + propertyIs + ToTerm("collect") + lpar + identifier + rpar
                                       | valueExp + dot + identifier + lpar + argumentList + rpar
                                       | valueExp + PreferShiftHere() + propertyIs + identifier + lpar + argumentList + rpar;
            productExp.Rule  = valueExp + PreferShiftHere() + propertyIs + ToTerm("product") + lpar + identifier + rpar;
            subSequence.Rule = valueExp + PreferShiftHere() + propertyIs + ToTerm("subSequence") + lpar + number + comma + number + rpar;
            flatten.Rule     = valueExp + PreferShiftHere() + propertyIs + ToTerm("flatten") + lpar + rpar;
            asSet.Rule       = valueExp + PreferShiftHere() + propertyIs + ToTerm("asSet") + lpar + rpar;
            asOrderdSet.Rule = valueExp + PreferShiftHere() + propertyIs + ToTerm("asOrderdSet") + lpar + rpar;
            asSequence.Rule  = valueExp + PreferShiftHere() + propertyIs + ToTerm("asSequence") + lpar + rpar;
            asBag.Rule       = valueExp + PreferShiftHere() + propertyIs + ToTerm("asBag") + lpar + rpar;

            #endregion

            #region singleValueCollectionMember
            singleValueCollectionMember.Rule = maxOperation | minOperation | countOperation | at | indexOf | first | last | sum | size;
            maxOperation.Rule   = valueExp + PreferShiftHere() + propertyIs + "max" + lpar + rpar;
            minOperation.Rule   = valueExp + PreferShiftHere() + propertyIs + "min" + lpar + rpar;
            countOperation.Rule = valueExp + PreferShiftHere() + propertyIs + "count" + lpar + identifier + rpar;
            at.Rule             = valueExp + PreferShiftHere() + propertyIs + "at" + lpar + identifier + rpar;
            indexOf.Rule        = valueExp + PreferShiftHere() + propertyIs + "indexOf" + lpar + identifier + rpar;
            first.Rule          = valueExp + PreferShiftHere() + propertyIs + "first" + lpar + rpar;
            last.Rule           = valueExp + PreferShiftHere() + propertyIs + "last" + lpar + rpar;
            sum.Rule            = valueExp + PreferShiftHere() + propertyIs + "sum" + lpar + rpar;
            size.Rule           = valueExp + PreferShiftHere() + propertyIs + "size" + lpar + rpar;
            #endregion

            #region iterateExp
            iterateExp.Rule = valueExp + PreferShiftHere() + propertyIs + "iterate" + lpar + iteratorList + ";"
                              + iteratorInitializationList + suchThat + expression + rpar;
            iteratorList.Rule = MakePlusRule(iteratorList, comma, variableDiclaration);
            iteratorInitializationList.Rule = MakePlusRule(iteratorInitializationList, comma, iteratorInitialization);
            iteratorInitialization.Rule     = variableDiclaration + equalsTo + valueExp;
            #endregion

            #region structuralExp
            structuralExp.Rule = ifThenElseExp | letExp;
            #endregion

            #region ifThenElseExp
            ifThenElseExp.Rule = "if" + valueExp + "then" + expression + "endif"
                                 | "if" + valueExp + "then" + expression + "else" + expression + "endif";
            #endregion

            #region letExp
            letExp.Rule = let + variableDiclaration + equalsTo + valueExp + In + expression
                          | let + identifier + equalsTo + valueExp + In + expression;
            #endregion

            #region invExp
            invExp.Rule    = oclInvExp | emofInvExp;
            oclInvExp.Rule = inv + identifier + colon + expression
                             | inv + colon + expression;
            emofInvExp.Rule = "invariant" + lbr + expression + rbr;
            #endregion

            #region contextExp
            contextExp.Rule = classContextExp | attributeContextExp | operationContextExp;
            #endregion

            #region classContextExp
            classContextExp.Rule       = classContextSignature + classBody;
            classContextSignature.Rule = context + type
                                         | context + identifier + colon + type;
            classBody.Rule     = MakePlusRule(classBody, null, classBodyItem);
            classBodyItem.Rule = invExp | attributeDiclaration | functionDefination;
            #endregion

            #region attributeContextExp
            attributeContextExp.Rule      = context + type + colon + type + attributeContextbody;
            attributeContextbody.Rule     = MakePlusRule(attributeContextbody, null, attributeContextbodyItem);
            attributeContextbodyItem.Rule = initExp | deriveExp;
            #endregion

            #region initExp
            initExp.Rule = ToTerm("init") + colon + equalsTo + valueExp;
            #endregion

            #region deriveExp
            deriveExp.Rule = ToTerm("derive") + colon + expression;
            #endregion

            #region operationContextExp
            operationContextExp.Rule       = operationContextSignature + invExp + operationContextBodyExps;
            operationContextSignature.Rule = context + customType + PreferShiftHere() + scopeIn + functionSignature;
            operationContextBodyExps.Rule  = MakePlusRule(operationContextBodyExps, null, operationContextBodyItem);
            operationContextBodyItem.Rule  = preCondition | bodyExp | postCondition;
            #endregion

            #region preCondition
            preCondition.Rule = pre + identifier + colon + valueExp
                                | pre + colon + valueExp;
            #endregion

            #region bodyExp
            bodyExp.Rule = body + colon + expression;
            #endregion

            #region postCondition
            postCondition.Rule = post + colon + valueExp
                                 | post + identifier + colon + valueExp;
            #endregion

            #endregion

            #region Operator,punctuation
            MarkPunctuation(",", "(", ")", "{", "}", "[", "]", ":");
            MarkMemberSelect(".", "->"); //dot, propertyIs);
            RegisterOperators(1, lpar, rpar);
            RegisterOperators(2, "let", "in");
            RegisterOperators(3, letExp, In);
            RegisterOperators(4, dot, scopeIn);
            RegisterOperators(5, not);
            RegisterOperators(6, "*", "/");
            RegisterOperators(7, letExp, In);
            RegisterOperators(8, dot, scopeIn);
            RegisterOperators(9, "+", "-");
            RegisterOperators(10, "<", ">", "<=", ">=");
            RegisterOperators(11, "=", "<>");
            RegisterOperators(12, and);
            RegisterOperators(12, "div", "implies");
            RegisterOperators(13, or);
            RegisterOperators(14, xor);
            RegisterOperators(15, "=", "<>");
            #endregion
            this.Root = specification;
        }
Exemple #13
0
        public AnalizadorPy()
            : base(caseSensitive: false)
        {
            #region expresiones regulares

            var           identificador = TerminalFactory.CreateCSharpIdentifier("identificador");
            var           numero        = TerminalFactory.CreateCSharpNumber("numero");
            var           val_false     = Constantes.falso;
            var           val_true      = Constantes.verdadero;
            StringLiteral cadena        = new StringLiteral("cadena", "\"");
            var           caracter      = TerminalFactory.CreateCSharpChar(Constantes.caracter);

            CommentTerminal COMENT_BLOQUE = new CommentTerminal("COMENTARIO BLOQUE", "/*", "*/");
            CommentTerminal COMENT_LINEA  = new CommentTerminal("COMENTARIO LINEA", "//", "\n", "\r\n");
            NonGrammarTerminals.Add(COMENT_BLOQUE);
            NonGrammarTerminals.Add(COMENT_LINEA);

            #endregion


            #region palabras reservadas
            var tipoDecimal  = Constantes.tipoDecimal;
            var tipoString   = Constantes.tipoCadena;
            var tipoBoolean  = Constantes.tipoBool;
            var tipoCaracter = Constantes.tipoChar;
            var tipoInt      = Constantes.tipoEntero;
            var tipoVoid     = Constantes.tipoVoid;

            var visiPublico   = Constantes.publico;
            var visiPrivado   = Constantes.privado;
            var visiProtegido = Constantes.protegido;

            var clase         = Constantes.clase;
            var sobreescribir = Constantes.sobreescribir;

            #endregion



            #region declaproducciones
            NonTerminal FUN_SOBRE    = new NonTerminal(Constantes.funSobre);
            NonTerminal TIPO         = new NonTerminal(Constantes.tipo);
            NonTerminal FUNCION      = new NonTerminal(Constantes.funcion);
            NonTerminal VISIBILIDAD  = new NonTerminal(Constantes.visibilidad);
            NonTerminal CUERPO       = new NonTerminal(Constantes.cuerpo);
            NonTerminal PARAMETRO    = new NonTerminal(Constantes.parametro);
            NonTerminal L_PARAMETRO  = new NonTerminal(Constantes.listaParametros);
            NonTerminal L_ELEMENTOS  = new NonTerminal(Constantes.listaElementos);
            NonTerminal ATRIBUTO     = new NonTerminal(Constantes.atributo);
            NonTerminal L_IDS        = new NonTerminal(Constantes.listaIds);
            NonTerminal EXPRESION    = new NonTerminal(Constantes.expresion);
            NonTerminal ELEMENTO     = new NonTerminal(Constantes.elementoClase);
            NonTerminal CLASE        = new NonTerminal(Constantes.clase);
            NonTerminal CUERPO_CLASE = new NonTerminal(Constantes.CUERPO_CLASE);
            NonTerminal PRINCIPAL    = new NonTerminal(Constantes.principal);
            NonTerminal CONSTRUCTOR  = new NonTerminal(Constantes.constructor);



            NonTerminal IMPRIMIR      = new NonTerminal(Constantes.imprimir);
            NonTerminal DECLAPARA     = new NonTerminal("DECLAPARA");
            NonTerminal INSTRUCCIONES = new NonTerminal(Constantes.instrucciones);
            NonTerminal INSTRUCCION   = new NonTerminal(Constantes.instruccion);
            NonTerminal DECLARACION   = new NonTerminal(Constantes.declaracion);
            NonTerminal LPOSICIONES   = new NonTerminal(Constantes.lposiciones);
            NonTerminal LEXPRESIONES  = new NonTerminal(Constantes.lexpresiones);
            NonTerminal LFILAS        = new NonTerminal(Constantes.lfilas);
            NonTerminal ASIGNACION    = new NonTerminal(Constantes.asignacion);
            NonTerminal POSICION      = new NonTerminal(Constantes.posicion);
            NonTerminal FILA          = new NonTerminal(Constantes.fila);


            NonTerminal DECIMAL     = new NonTerminal(Constantes.tipoDecimal);
            NonTerminal ENTERO      = new NonTerminal(Constantes.tipoEntero);
            NonTerminal CADENA      = new NonTerminal(Constantes.tipoCadena);
            NonTerminal CHAR        = new NonTerminal(Constantes.tipoChar);
            NonTerminal BOOLEANO    = new NonTerminal(Constantes.tipoBool);
            NonTerminal SIMB_ARIT   = new NonTerminal(Constantes.simb_arit);
            NonTerminal SIMB_REL    = new NonTerminal(Constantes.simb_rel);
            NonTerminal UNARIO      = new NonTerminal(Constantes.unario);
            NonTerminal ID          = new NonTerminal(Constantes.id);
            NonTerminal NEGATIVO    = new NonTerminal(Constantes.negativo);
            NonTerminal RELACIONAL  = new NonTerminal(Constantes.relacional);
            NonTerminal ARITMETICA  = new NonTerminal(Constantes.aritmetica);
            NonTerminal LOGICA      = new NonTerminal(Constantes.logica);
            NonTerminal LLAMADA     = new NonTerminal(Constantes.llamada);
            NonTerminal POSVECTOR   = new NonTerminal(Constantes.posvector);
            NonTerminal LISTAPUNTOS = new NonTerminal(Constantes.listapuntos);
            NonTerminal SIMB_LOG    = new NonTerminal(Constantes.simb_log);
            NonTerminal MAS_MAS     = new NonTerminal(Constantes.masmas);
            NonTerminal MENOS_MENOS = new NonTerminal(Constantes.menosmenos);
            NonTerminal ASIG_ARRAY  = new NonTerminal(Constantes.asig_array);
            NonTerminal termino     = new NonTerminal(Constantes.termino);
            NonTerminal RETORNO     = new NonTerminal(Constantes.retorno);
            NonTerminal LISTACLASES = new NonTerminal(Constantes.l_clases);



            NonTerminal SUMA           = new NonTerminal(Constantes.suma);
            NonTerminal RESTA          = new NonTerminal(Constantes.resta);
            NonTerminal MULTIPLICACION = new NonTerminal(Constantes.multiplicacion);
            NonTerminal DIVISION       = new NonTerminal(Constantes.division);
            NonTerminal POTENCIA       = new NonTerminal(Constantes.potencia);
            NonTerminal MENOR          = new NonTerminal(Constantes.menor);
            NonTerminal MENORIGUAL     = new NonTerminal(Constantes.menorIgual);
            NonTerminal MAYOR          = new NonTerminal(Constantes.mayor);
            NonTerminal MAYORIGUAL     = new NonTerminal(Constantes.mayorIgual);
            NonTerminal IGUALIGUAL     = new NonTerminal(Constantes.igualIgual);
            NonTerminal DISTINTOA      = new NonTerminal(Constantes.distintoA);
            NonTerminal XOR            = new NonTerminal(Constantes.xorJava);
            NonTerminal AND            = new NonTerminal(Constantes.andJava);
            NonTerminal NOT            = new NonTerminal(Constantes.notJavaPython);
            NonTerminal OR             = new NonTerminal(Constantes.orJava);
            NonTerminal INSTANCIA      = new NonTerminal(Constantes.instancia);
            NonTerminal SALIR          = new NonTerminal(Constantes.salir);
            NonTerminal CONTINUAR      = new NonTerminal(Constantes.continuar);

            NonTerminal SI       = new NonTerminal(Constantes.si);
            NonTerminal EXTRA    = new NonTerminal(Constantes.extraSi);
            NonTerminal SINO     = new NonTerminal(Constantes.sino);
            NonTerminal CUERPOSI = new NonTerminal(Constantes.cuerposi);
            NonTerminal L_EXTRAS = new NonTerminal(Constantes.lextra);

            NonTerminal MIENTRAS = new NonTerminal(Constantes.mientras);
            NonTerminal REPETIR  = new NonTerminal(Constantes.repetir);
            NonTerminal HACER    = new NonTerminal(Constantes.hacer);
            NonTerminal PARA     = new NonTerminal(Constantes.para);
            NonTerminal LOOP     = new NonTerminal(Constantes.loop);


            #endregion

            VISIBILIDAD.Rule = ToTerm(visiPrivado)
                               | ToTerm(visiProtegido)
                               | ToTerm(visiPublico);


            TIPO.Rule = ToTerm(tipoBoolean)
                        | ToTerm(tipoCaracter)
                        | ToTerm(tipoDecimal)
                        | ToTerm(tipoInt)
                        | ToTerm(tipoString)
                        | identificador;


            L_IDS.Rule = MakePlusRule(L_IDS, ToTerm(","), identificador);

            DECLARACION.Rule = TIPO + L_IDS
                               | TIPO + L_IDS + LPOSICIONES;


            POSICION.Rule = ToTerm("[") + EXPRESION + "]";

            LPOSICIONES.Rule = MakePlusRule(LPOSICIONES, POSICION);

            FILA.Rule = ToTerm("{") + LEXPRESIONES + "}";



            LFILAS.Rule = MakePlusRule(LFILAS, ToTerm(","), FILA);


            ASIGNACION.Rule = EXPRESION + ToTerm("=") + ">" + EXPRESION;



            INSTRUCCION.Rule = DECLARACION + Eos
                               | CONTINUAR + Eos
                               | SALIR + Eos
                               | MIENTRAS + Eos
                               | HACER
                               | REPETIR
                               | LOOP + Eos;


            INSTRUCCIONES.Rule = MakePlusRule(INSTRUCCIONES, INSTRUCCION);

            CUERPO.Rule = Indent + INSTRUCCIONES + Dedent;

            FUNCION.Rule = VISIBILIDAD + ToTerm("funcion") + TIPO + identificador + "[" + "]" + Eos + CUERPO;



            #region estructuras de control

            CONTINUAR.Rule = ToTerm(Constantes.continuar);

            SALIR.Rule = ToTerm(Constantes.salir);

            MIENTRAS.Rule = ToTerm(Constantes.mientras) + EXPRESION + ":" + Eos + CUERPO;

            HACER.Rule = ToTerm(Constantes.hacer) + ":" + Eos + CUERPO + ToTerm(Constantes.mientras) + EXPRESION + Eos;

            REPETIR.Rule = ToTerm(Constantes.repetir) + ":" + Eos + CUERPO + ToTerm(Constantes.hasta) + EXPRESION + Eos;

            LOOP.Rule = ToTerm(Constantes.loop) + ":" + Eos + CUERPO;



            #endregion



            #region expresion



            DECIMAL.Rule  = numero;
            ENTERO.Rule   = numero;
            CADENA.Rule   = cadena;
            ID.Rule       = identificador;
            CHAR.Rule     = caracter;
            BOOLEANO.Rule = ToTerm(val_false)
                            | ToTerm(val_true);


            ARITMETICA.Rule = SUMA
                              | RESTA
                              | MULTIPLICACION
                              | DIVISION
                              | POTENCIA;

            RELACIONAL.Rule = MENOR
                              | MAYOR
                              | MENORIGUAL
                              | MAYORIGUAL
                              | DISTINTOA
                              | IGUALIGUAL;

            LOGICA.Rule = XOR
                          | OR
                          | AND
                          | NOT;



            SUMA.Rule           = EXPRESION + ToTerm(Constantes.suma) + EXPRESION;
            RESTA.Rule          = EXPRESION + ToTerm(Constantes.resta) + EXPRESION;
            MULTIPLICACION.Rule = EXPRESION + ToTerm(Constantes.multiplicacion) + EXPRESION;
            DIVISION.Rule       = EXPRESION + ToTerm(Constantes.division) + EXPRESION;
            POTENCIA.Rule       = EXPRESION + ToTerm(Constantes.potencia) + EXPRESION;
            MENOR.Rule          = EXPRESION + ToTerm(Constantes.menor) + EXPRESION;
            MENORIGUAL.Rule     = EXPRESION + ToTerm(Constantes.menorIgual) + EXPRESION;
            MAYOR.Rule          = EXPRESION + ToTerm(Constantes.mayor) + EXPRESION;
            MAYORIGUAL.Rule     = EXPRESION + ToTerm(Constantes.mayorIgual) + EXPRESION;
            IGUALIGUAL.Rule     = EXPRESION + ToTerm(Constantes.igualIgual) + EXPRESION;
            DISTINTOA.Rule      = EXPRESION + ToTerm(Constantes.distintoA) + EXPRESION;
            XOR.Rule            = EXPRESION + ToTerm(Constantes.xorPython) + EXPRESION;
            AND.Rule            = EXPRESION + ToTerm(Constantes.andPython) + EXPRESION;
            NOT.Rule            = ToTerm(Constantes.notJavaPython) + EXPRESION;
            OR.Rule             = EXPRESION + ToTerm(Constantes.orPython) + EXPRESION;

            INSTANCIA.Rule = Constantes.nuevoPython + identificador + "[" + LEXPRESIONES + "]"
                             | Constantes.nuevoPython + identificador + "[" + "]";

            UNARIO.Rule = MAS_MAS
                          | MENOS_MENOS;

            MAS_MAS.Rule = identificador + ToTerm(Constantes.masmas);

            MENOS_MENOS.Rule = identificador + ToTerm(Constantes.menosmenos);


            NEGATIVO.Rule = ToTerm("-") + EXPRESION;

            termino.Rule = ToTerm("(") + ARITMETICA + ")"
                           | ToTerm("[") + RELACIONAL + "]"
                           | ToTerm("{") + LOGICA + "}"
                           | DECIMAL
                           | ENTERO
                           | ID
                           | CADENA
                           | BOOLEANO
                           | CHAR
                           | LLAMADA
                           | POSVECTOR
                           | ToTerm("(") + UNARIO + ")"
                           | NEGATIVO
                           | "{" + LFILAS + "}"
                           | INSTANCIA;

            LLAMADA.Rule = identificador + ToTerm("[") + LEXPRESIONES + "]"
                           | identificador + ToTerm("[") + "]";


            POSVECTOR.Rule = identificador + LPOSICIONES;

            L_IDS.Rule = MakePlusRule(L_IDS, ToTerm(","), identificador);



            EXPRESION.Rule = MakePlusRule(EXPRESION, ToTerm("."), termino);

            LEXPRESIONES.Rule = MakePlusRule(EXPRESION, ToTerm(","), EXPRESION);



            #endregion



            NonTerminal n = new NonTerminal("fdsfd");
            n.Rule = termino + Eos;



            this.Root = n;
        }
Exemple #14
0
        public Gramatica()
            : base(caseSensitive: false)
        {
            #region expresiones regulares

            var           doble         = new RegexBasedTerminal("doble", "[0-9]+[.][0-9]+");
            var           entero        = new RegexBasedTerminal("entero", "[0-9]+");
            var           identificador = TerminalFactory.CreateCSharpIdentifier("identificador");
            var           numero        = TerminalFactory.CreateCSharpNumber("numero");
            var           val_false     = Constantes.falso;
            var           val_true      = Constantes.verdadero;
            StringLiteral cadena        = new StringLiteral("cadena", "\"");
            var           caracter      = TerminalFactory.CreateCSharpChar(Constantes.caracter);

            CommentTerminal COMENT_BLOQUE = new CommentTerminal("COMENTARIO BLOQUE", "/*", "*/");
            CommentTerminal COMENT_LINEA  = new CommentTerminal("COMENTARIO LINEA", "//", "\n", "\r\n");
            NonGrammarTerminals.Add(COMENT_BLOQUE);
            NonGrammarTerminals.Add(COMENT_LINEA);

            #endregion


            #region palabras reservadas
            var tipoDecimal  = Constantes.tipoDecimal;
            var tipoString   = Constantes.tipoCadena;
            var tipoBoolean  = Constantes.tipoBool;
            var tipoCaracter = Constantes.tipoChar;
            var tipoInt      = Constantes.tipoEntero;
            var tipoVoid     = Constantes.tipoVoid;

            var visiPublico   = Constantes.publico;
            var visiPrivado   = Constantes.privado;
            var visiProtegido = Constantes.protegido;

            var clase         = Constantes.clase;
            var sobreescribir = Constantes.sobreescribir;



            #endregion



            #region No terminales
            NonTerminal FUN_SOBRE    = new NonTerminal(Constantes.funSobre);
            NonTerminal TIPO         = new NonTerminal(Constantes.tipo);
            NonTerminal FUNCION      = new NonTerminal(Constantes.funcion);
            NonTerminal VISIBILIDAD  = new NonTerminal(Constantes.visibilidad);
            NonTerminal CUERPO       = new NonTerminal(Constantes.cuerpo);
            NonTerminal PARAMETRO    = new NonTerminal(Constantes.parametro);
            NonTerminal L_PARAMETRO  = new NonTerminal(Constantes.listaParametros);
            NonTerminal L_ELEMENTOS  = new NonTerminal(Constantes.listaElementos);
            NonTerminal ATRIBUTO     = new NonTerminal(Constantes.atributo);
            NonTerminal L_IDS        = new NonTerminal(Constantes.listaIds);
            NonTerminal EXPRESION    = new NonTerminal(Constantes.expresion);
            NonTerminal ELEMENTO     = new NonTerminal(Constantes.elementoClase);
            NonTerminal CLASE        = new NonTerminal(Constantes.clase);
            NonTerminal CUERPO_CLASE = new NonTerminal(Constantes.CUERPO_CLASE);
            NonTerminal PRINCIPAL    = new NonTerminal(Constantes.principal);
            NonTerminal CONSTRUCTOR  = new NonTerminal(Constantes.constructor);

            NonTerminal SI       = new NonTerminal(Constantes.si);
            NonTerminal EXTRA    = new NonTerminal(Constantes.extraSi);
            NonTerminal SINO     = new NonTerminal(Constantes.sino);
            NonTerminal CUERPOSI = new NonTerminal(Constantes.cuerposi);
            NonTerminal L_EXTRAS = new NonTerminal(Constantes.lextra);

            NonTerminal MIENTRAS      = new NonTerminal(Constantes.mientras);
            NonTerminal REPETIR       = new NonTerminal(Constantes.repetir);
            NonTerminal HACER         = new NonTerminal(Constantes.hacer);
            NonTerminal X             = new NonTerminal(Constantes.x);
            NonTerminal PARA          = new NonTerminal(Constantes.para);
            NonTerminal IMPRIMIR      = new NonTerminal(Constantes.imprimir);
            NonTerminal DECLAPARA     = new NonTerminal("DECLAPARA");
            NonTerminal INSTRUCCIONES = new NonTerminal(Constantes.instrucciones);
            NonTerminal INSTRUCCION   = new NonTerminal(Constantes.instruccion);
            NonTerminal DECLARACION   = new NonTerminal(Constantes.decla2);
            NonTerminal LPOSICIONES   = new NonTerminal(Constantes.lposiciones);
            NonTerminal LEXPRESIONES  = new NonTerminal(Constantes.lexpresiones);
            NonTerminal LFILAS        = new NonTerminal(Constantes.lfilas);
            NonTerminal ASIGNACION    = new NonTerminal(Constantes.asignacion);
            NonTerminal POSICION      = new NonTerminal(Constantes.posicion);
            NonTerminal FILA          = new NonTerminal(Constantes.fila);


            NonTerminal DECIMAL     = new NonTerminal(Constantes.tipoDecimal);
            NonTerminal ENTERO      = new NonTerminal(Constantes.tipoEntero);
            NonTerminal CADENA      = new NonTerminal(Constantes.tipoCadena);
            NonTerminal CHAR        = new NonTerminal(Constantes.tipoChar);
            NonTerminal BOOLEANO    = new NonTerminal(Constantes.tipoBool);
            NonTerminal SIMB_ARIT   = new NonTerminal(Constantes.simb_arit);
            NonTerminal SIMB_REL    = new NonTerminal(Constantes.simb_rel);
            NonTerminal UNARIO      = new NonTerminal(Constantes.unario);
            NonTerminal ID          = new NonTerminal(Constantes.id);
            NonTerminal NEGATIVO    = new NonTerminal(Constantes.negativo);
            NonTerminal RELACIONAL  = new NonTerminal(Constantes.relacional);
            NonTerminal ARITMETICA  = new NonTerminal(Constantes.aritmetica);
            NonTerminal LOGICA      = new NonTerminal(Constantes.logica);
            NonTerminal LLAMADA     = new NonTerminal(Constantes.llamada);
            NonTerminal POSVECTOR   = new NonTerminal(Constantes.posvector);
            NonTerminal LISTAPUNTOS = new NonTerminal(Constantes.listapuntos);
            NonTerminal SIMB_LOG    = new NonTerminal(Constantes.simb_log);
            NonTerminal MAS_MAS     = new NonTerminal(Constantes.masmas);
            NonTerminal MENOS_MENOS = new NonTerminal(Constantes.menosmenos);
            NonTerminal ASIG_ARRAY  = new NonTerminal(Constantes.asig_array);
            NonTerminal TERMINO     = new NonTerminal(Constantes.termino);
            NonTerminal RETORNO     = new NonTerminal(Constantes.retorno);
            NonTerminal LISTACLASES = new NonTerminal(Constantes.l_clases);



            NonTerminal SUMA           = new NonTerminal(Constantes.suma);
            NonTerminal RESTA          = new NonTerminal(Constantes.resta);
            NonTerminal MULTIPLICACION = new NonTerminal(Constantes.multiplicacion);
            NonTerminal DIVISION       = new NonTerminal(Constantes.division);
            NonTerminal POTENCIA       = new NonTerminal(Constantes.potencia);
            NonTerminal MENOR          = new NonTerminal(Constantes.menor);
            NonTerminal MENORIGUAL     = new NonTerminal(Constantes.menorIgual);
            NonTerminal MAYOR          = new NonTerminal(Constantes.mayor);
            NonTerminal MAYORIGUAL     = new NonTerminal(Constantes.mayorIgual);
            NonTerminal IGUALIGUAL     = new NonTerminal(Constantes.igualIgual);
            NonTerminal DISTINTOA      = new NonTerminal(Constantes.distintoA);
            NonTerminal XOR            = new NonTerminal(Constantes.xorJava);
            NonTerminal AND            = new NonTerminal(Constantes.andJava);
            NonTerminal NOT            = new NonTerminal(Constantes.notJavaPython);
            NonTerminal OR             = new NonTerminal(Constantes.orJava);
            NonTerminal INSTANCIA      = new NonTerminal(Constantes.instancia);

            NonTerminal THIS          = new NonTerminal("THIS");
            NonTerminal SUPER         = new NonTerminal("SUPER");
            NonTerminal LLAMADAOBJETO = new NonTerminal("LLAMADA_OBJETO");

            NonTerminal tipoLista = new NonTerminal("tipoElemento");



            #endregion

            #region gramatica


            #region clases

            LISTACLASES.Rule = MakePlusRule(LISTACLASES, CLASE);
            CLASE.Rule       = ToTerm(clase) + identificador + identificador + CUERPO_CLASE
                               | ToTerm(clase) + identificador + CUERPO_CLASE;



            CUERPO_CLASE.Rule = ToTerm("{") + L_ELEMENTOS + ToTerm("}");


            L_ELEMENTOS.Rule = MakeStarRule(L_ELEMENTOS, ELEMENTO);

            ELEMENTO.Rule = FUNCION
                            | ATRIBUTO
                            | PRINCIPAL
                            | CONSTRUCTOR
                            | FUN_SOBRE;

            FUN_SOBRE.Rule = ToTerm("@") + ToTerm(sobreescribir) + FUNCION;

            #endregion



            #region funciones

            PRINCIPAL.Rule = ToTerm(Constantes.principal) + ToTerm("(") + ToTerm(")") + CUERPO;

            CONSTRUCTOR.Rule = identificador + ToTerm("(") + L_PARAMETRO + ToTerm(")") + CUERPO;

            FUNCION.Rule = VISIBILIDAD + TIPO + identificador + ToTerm("(") + L_PARAMETRO + ToTerm(")") + CUERPO
                           | VISIBILIDAD + ToTerm(tipoVoid) + identificador + ToTerm("(") + L_PARAMETRO + ToTerm(")") + CUERPO
                           | TIPO + identificador + ToTerm("(") + L_PARAMETRO + ToTerm(")") + CUERPO
                           | ToTerm(tipoVoid) + identificador + ToTerm("(") + L_PARAMETRO + ToTerm(")") + CUERPO;



            CUERPO.Rule = ToTerm("{") + INSTRUCCIONES + "}";



            #endregion



            RETORNO.Rule = ToTerm(Constantes.retorno) + EXPRESION + ToTerm(";");

            ATRIBUTO.Rule = VISIBILIDAD + TIPO + L_IDS + ToTerm(";")
                            | VISIBILIDAD + TIPO + identificador + ToTerm("=") + EXPRESION + ToTerm(";") //1
                            | TIPO + L_IDS + ToTerm(";")
                            | TIPO + identificador + ToTerm("=") + EXPRESION + ToTerm(";")               //1
                            | VISIBILIDAD + TIPO + identificador + LPOSICIONES + ToTerm(";")
                            | VISIBILIDAD + TIPO + identificador + LPOSICIONES + ToTerm("=") + "{" + LFILAS + "}" + ";"
                            | TIPO + identificador + LPOSICIONES + ToTerm(";")
                            | TIPO + identificador + LPOSICIONES + ToTerm("=") + "{" + LFILAS + "}" + ";"
                            | TIPO + identificador + ToTerm("=") + INSTANCIA + ";"
                            | VISIBILIDAD + TIPO + identificador + ToTerm("=") + INSTANCIA + ";";


            L_IDS.Rule = MakePlusRule(L_IDS, ToTerm(","), identificador);

            TIPO.Rule = ToTerm(tipoBoolean)
                        | ToTerm(tipoCaracter)
                        | ToTerm(tipoDecimal)
                        | ToTerm(tipoInt)
                        | ToTerm(tipoString)
                        | identificador;


            VISIBILIDAD.Rule = ToTerm(visiPrivado)
                               | ToTerm(visiProtegido)
                               | ToTerm(visiPublico);


            PARAMETRO.Rule = TIPO + identificador;

            L_PARAMETRO.Rule = MakeStarRule(L_PARAMETRO, ToTerm(","), PARAMETRO);



            #region sentenciasControl

            SI.Rule = ToTerm(Constantes.si) + "(" + EXPRESION + ")" + CUERPO + L_EXTRAS + SINO
                      | ToTerm(Constantes.si) + "(" + EXPRESION + ")" + CUERPO + L_EXTRAS
                      | ToTerm(Constantes.si) + "(" + EXPRESION + ")" + CUERPO + SINO;



            SINO.Rule = ToTerm(Constantes.sino) + CUERPO;

            EXTRA.Rule = ToTerm(Constantes.sino) + Constantes.si + CUERPO;

            L_EXTRAS.Rule = MakeStarRule(L_EXTRAS, EXTRA);


            MIENTRAS.Rule = ToTerm(Constantes.mientras) + "(" + EXPRESION + ")" + CUERPO;

            HACER.Rule = ToTerm(Constantes.hacer) + CUERPO + Constantes.mientras + "(" + EXPRESION + ")" + ";";

            X.Rule = ToTerm(Constantes.x) + "(" + EXPRESION + "," + EXPRESION + ")" + CUERPO;

            REPETIR.Rule = ToTerm(Constantes.repetir) + CUERPO + Constantes.until + "(" + EXPRESION + ")" + ";";



            PARA.Rule = ToTerm(Constantes.para) + "(" + DECLAPARA + ";" + EXPRESION + ";" + EXPRESION + ")" + CUERPO;

            IMPRIMIR.Rule = ToTerm(Constantes.imprimir) + "(" + EXPRESION + ")" + ";";


            INSTRUCCION.Rule = IMPRIMIR
                               | PARA                    //--
                               | REPETIR                 //--
                               | X
                               | HACER                   //--
                               | MIENTRAS                //--
                               | SI                      //--
                               | DECLARACION             //
                               | ASIGNACION              //--
                               | EXPRESION + ToTerm(";") //--
                               | RETORNO;                //--

            DECLAPARA.Rule = DECLARACION
                             | ASIGNACION;

            INSTRUCCIONES.Rule = MakeStarRule(INSTRUCCIONES, INSTRUCCION);



            DECLARACION.Rule = TIPO + identificador + ToTerm(";")
                               | TIPO + identificador + ToTerm("=") + EXPRESION + ";"
                               | TIPO + identificador + LPOSICIONES + ToTerm(";")
                               | TIPO + identificador + LPOSICIONES + ToTerm("=") + "{" + LFILAS + "}" + ";"
                               | TIPO + identificador + ToTerm("=") + INSTANCIA + ";";


            ASIGNACION.Rule = EXPRESION + ToTerm("=") + EXPRESION + ";"
                              | EXPRESION + ToTerm("=") + INSTANCIA;



            #region expresion


            POSICION.Rule = ToTerm("[") + EXPRESION + "]";

            LPOSICIONES.Rule = MakePlusRule(LPOSICIONES, POSICION);

            FILA.Rule = ToTerm("{") + LEXPRESIONES + "}";



            LFILAS.Rule = MakePlusRule(LFILAS, ToTerm(","), FILA);

            DECIMAL.Rule  = doble;
            ENTERO.Rule   = entero;
            CADENA.Rule   = cadena;
            ID.Rule       = identificador;
            CHAR.Rule     = caracter;
            BOOLEANO.Rule = ToTerm(val_false)
                            | ToTerm(val_true);



            ARITMETICA.Rule = SUMA
                              | RESTA
                              | MULTIPLICACION
                              | DIVISION
                              | POTENCIA;

            RELACIONAL.Rule = MENOR
                              | MAYOR
                              | MENORIGUAL
                              | MAYORIGUAL
                              | DISTINTOA
                              | IGUALIGUAL;

            LOGICA.Rule = XOR
                          | OR
                          | AND
                          | NOT;



            SUMA.Rule           = TERMINO + ToTerm(Constantes.suma) + TERMINO;
            RESTA.Rule          = TERMINO + ToTerm(Constantes.resta) + TERMINO;
            MULTIPLICACION.Rule = TERMINO + ToTerm(Constantes.multiplicacion) + TERMINO;
            DIVISION.Rule       = TERMINO + ToTerm(Constantes.division) + TERMINO;
            POTENCIA.Rule       = TERMINO + ToTerm(Constantes.potencia) + TERMINO;
            MENOR.Rule          = TERMINO + ToTerm(Constantes.menor) + TERMINO;
            MENORIGUAL.Rule     = TERMINO + ToTerm(Constantes.menorIgual) + TERMINO;
            MAYOR.Rule          = TERMINO + ToTerm(Constantes.mayor) + TERMINO;
            MAYORIGUAL.Rule     = TERMINO + ToTerm(Constantes.mayorIgual) + TERMINO;
            IGUALIGUAL.Rule     = TERMINO + ToTerm(Constantes.igualIgual) + TERMINO;
            DISTINTOA.Rule      = TERMINO + ToTerm(Constantes.distintoA) + TERMINO;
            XOR.Rule            = TERMINO + ToTerm(Constantes.xorJava) + TERMINO;
            AND.Rule            = TERMINO + ToTerm(Constantes.andJava) + TERMINO;
            NOT.Rule            = ToTerm(Constantes.notJavaPython) + TERMINO;
            OR.Rule             = TERMINO + ToTerm(Constantes.orJava) + TERMINO;



            INSTANCIA.Rule = Constantes.nuevo + identificador + "(" + LEXPRESIONES + ")"
                             | Constantes.nuevo + identificador + "(" + ")";

            UNARIO.Rule = MAS_MAS
                          | MENOS_MENOS;

            MAS_MAS.Rule = identificador + ToTerm(Constantes.masmas);

            MENOS_MENOS.Rule = identificador + ToTerm(Constantes.menosmenos);


            NEGATIVO.Rule = ToTerm("-") + TERMINO;

            TERMINO.Rule = ARITMETICA                    //
                           | RELACIONAL                  //
                           | LOGICA                      //
                           | DECIMAL                     //
                           | ENTERO                      //
                           | ID                          //
                           | CADENA                      //
                           | BOOLEANO                    //
                           | CHAR                        //
                           | LLAMADA                     //
                           | POSVECTOR                   //
                           | UNARIO
                           | ToTerm("(") + TERMINO + ")" //no es necesario en python
                           | NEGATIVO
                           | "{" + LFILAS + "}"
                           | THIS
                           | LLAMADAOBJETO;//no existe en python;
            // | INSTANCIA;//



            tipoLista.Rule = ID
                             | LLAMADA;

            LLAMADAOBJETO.Rule = MakePlusRule(LLAMADAOBJETO, ToTerm("."), tipoLista);
            THIS.Rule          = ToTerm(Constantes.este) + "." + ID;

            LLAMADA.Rule = identificador + ToTerm("(") + LEXPRESIONES + ")"
                           | identificador + ToTerm("(") + ")";


            POSVECTOR.Rule = identificador + LPOSICIONES;

            L_IDS.Rule = MakePlusRule(L_IDS, ToTerm(","), identificador);


            LEXPRESIONES.Rule = MakePlusRule(LEXPRESIONES, ToTerm(","), EXPRESION);
            // EXPRESION.Rule = MakePlusRule(EXPRESION, ToTerm("."), TERMINO);
            EXPRESION.Rule = TERMINO;



            #endregion



            this.RegisterOperators(9, UNARIO, NEGATIVO);
            this.RegisterOperators(8, Associativity.Right, "^");
            this.RegisterOperators(7, Associativity.Left, "/", "*");
            this.RegisterOperators(6, Associativity.Left, "-", "+");
            this.RegisterOperators(5, "==", "!=", "<", ">", "<=", ">=");
            this.RegisterOperators(4, Associativity.Left, "NOT");
            this.RegisterOperators(3, Associativity.Left, "&&");
            this.RegisterOperators(2, Associativity.Left, "??");
            this.RegisterOperators(1, Associativity.Left, "||");
            this.RegisterOperators(10, Associativity.Left, "(");



            MarkPunctuation(Constantes.este, ",", "(", ")", ";", "=", "@", "{", "}", "clase", "[", "]", Constantes.nuevo, ".", "si", "sino",
                            "mientras", "hacer", "para", "x", "repetir", "return", "imprimir", Constantes.masmas, Constantes.menosmenos,
                            Constantes.menor, Constantes.mayor, Constantes.menorIgual, Constantes.mayorIgual, Constantes.igualIgual, Constantes.distintoA,
                            Constantes.principal, Constantes.orJava, Constantes.andJava, Constantes.xorJava, Constantes.notJavaPython, sobreescribir, "*", "^", "+", "-", "/", Constantes.retorno);



            MarkTransient(L_ELEMENTOS, ELEMENTO, POSICION, SIMB_ARIT, SIMB_LOG, SIMB_REL, DECLAPARA, INSTRUCCION, INSTRUCCIONES,
                          ARITMETICA, LOGICA, RELACIONAL, UNARIO, INSTRUCCIONES, TERMINO, CUERPO_CLASE, tipoLista);



            this.Root = LISTACLASES;



            #endregion



            #endregion
        }
Exemple #15
0
        public Gramatica() : base(caseSensitive: true)
        {
            #region ER
            RegexBasedTerminal numero = new RegexBasedTerminal("numero", "[0-9]+");
            RegexBasedTerminal deci   = new RegexBasedTerminal("decimal", "[0-9]+[.][0-9]+");
            IdentifierTerminal id     = new IdentifierTerminal("id");
            CommentTerminal    str    = new CommentTerminal("cadena", "\"", "\"");


            CommentTerminal comentarioLinea  = new CommentTerminal("comentarioLinea", "##", "\n");
            CommentTerminal comentarioBloque = new CommentTerminal("comentarioBloque", "{--", "--}");
            StringLiteral   cha = TerminalFactory.CreateCSharpChar("caracter");



            #endregion

            #region Terminales

            var url         = ToTerm("http");
            var sla         = ToTerm("~");
            var pt          = ToTerm("&");
            var dosp        = ToTerm(":");
            var par1        = ToTerm("(");
            var par2        = ToTerm(")");
            var intt        = ToTerm("entero");
            var stringg     = ToTerm("cadena");
            var doublee     = ToTerm("decimal");
            var charr       = ToTerm("caracter");
            var booll       = ToTerm("booleano");
            var mas         = ToTerm("+");
            var menos       = ToTerm("-");
            var por         = ToTerm("*");
            var division    = ToTerm("/");
            var poten       = ToTerm("pow");
            var publico     = ToTerm("publico");
            var protegido   = ToTerm("protegido");
            var privado     = ToTerm("privado");
            var corch1      = ToTerm("[");
            var corch2      = ToTerm("]");
            var llave1      = ToTerm("{");
            var llave2      = ToTerm("}");
            var truee       = ToTerm("true");
            var falsee      = ToTerm("false");
            var and         = ToTerm("and");
            var or          = ToTerm("or");
            var not         = ToTerm("not");
            var xor         = ToTerm("xor");
            var mayor       = ToTerm(">");
            var menor       = ToTerm("<");
            var mayori      = ToTerm(">=");
            var menori      = ToTerm("<=");
            var iguali      = ToTerm("==");
            var distinto    = ToTerm("!=");
            var imprimir    = ToTerm("imprimir");
            var metodo      = ToTerm("metodo");
            var funcion     = ToTerm("funcion");
            var retornar    = ToTerm("return");
            var clase       = ToTerm("clase");
            var constructor = ToTerm("__constructor");
            var nuevo       = ToTerm("nuevo");
            var si          = ToTerm("si");
            var sino1       = ToTerm("si_no");
            var sinosi      = ToTerm("si_no_si");
            var caso        = ToTerm("caso");
            var defecto     = ToTerm("defecto");
            var mientras    = ToTerm("mientras");
            var hacer       = ToTerm("hacer");
            var salir       = ToTerm("salir");
            var continuar   = ToTerm("continuar");
            var repetir     = ToTerm("repetir");
            var hasta       = ToTerm("hasta");
            var loop        = ToTerm("loop");
            var para        = ToTerm("para");
            var masmas      = ToTerm("++");
            var menmen      = ToTerm("--");
            var punto       = ToTerm(".");
            var igual       = ToTerm("=>");
            var superr      = ToTerm("super");
            var importar    = ToTerm("importar");
            var self        = ToTerm("self");
            var elegir      = ToTerm("elegir");
            var outs        = ToTerm("out_string");
            var parseint    = ToTerm("parseint");
            var parsedo     = ToTerm("parsedouble");
            var intstr      = ToTerm("inttostr");
            var doustr      = ToTerm("doubletostr");
            var douint      = ToTerm("doubletoint");



            #endregion

            #region No Terminales
            NonTerminal S           = new NonTerminal("S"),
                        E           = new NonTerminal("E"),
                        BLOQUE      = new NonTerminal("BLOQUE"),
                        SENTENCIA   = new NonTerminal("SENTENCIA"),
                        MOSTRAR     = new NonTerminal("MOSTRAR"),
                        LID         = new NonTerminal("LID"),
                        LVEC        = new NonTerminal("LVEC"),
                        LVEC1       = new NonTerminal("LVEC1"),
                        TIPO        = new NonTerminal("TIPO"),
                        VALOR       = new NonTerminal("VALOR"),
                        CLASE       = new NonTerminal("CLASE"),
                        FUNCIONES   = new NonTerminal("FUNCIONES"),
                        CFUN        = new NonTerminal("CFUN"),
                        LLAMAR      = new NonTerminal("LLAMAR"),
                        ASG         = new NonTerminal("ASIGNAR"),
                        ENTERES     = new NonTerminal("ENTERES"),
                        IMPRIMIR    = new NonTerminal("IMPRIMIR"),
                        PARAMETROS  = new NonTerminal("PARAMETROS"),
                        CFUNCIONES  = new NonTerminal("CFUNCIONES"),
                        DEC         = new NonTerminal("DEC"),
                        DEC2        = new NonTerminal("DEC2"),
                        DEC4        = new NonTerminal("DEC4"),
                        DECV        = new NonTerminal("DECV"),
                        DECV1       = new NonTerminal("DECV1"),
                        DEC3        = new NonTerminal("DEC3"),
                        PRIV        = new NonTerminal("PRIVACIADA"),
                        IMPRESION   = new NonTerminal("IMPRESION"),
                        IFC         = new NonTerminal("IFC"),
                        SALIR       = new NonTerminal("SALIR"),
                        IF          = new NonTerminal("IF"),
                        FOR         = new NonTerminal("FOR"),
                        ASIGNACION  = new NonTerminal("ASIGNACION"),
                        METODOS     = new NonTerminal("METODOS"),
                        EA          = new NonTerminal("EA"),
                        LELIF       = new NonTerminal("LELIF"),
                        ELIF        = new NonTerminal("ELIF"),
                        ELSE        = new NonTerminal("ELSE"),
                        COND        = new NonTerminal("COND"),
                        ELEGIR      = new NonTerminal("ELEGIR"),
                        CASO        = new NonTerminal("CASO"),
                        CASO2       = new NonTerminal("CASO2"),
                        DEF         = new NonTerminal("DEF"),
                        RET         = new NonTerminal("RET"),
                        CICLOS      = new NonTerminal("CICLOS"),
                        SAL         = new NonTerminal("SAL"),
                        WHILE       = new NonTerminal("WHILE"),
                        DOWHILE     = new NonTerminal("DO"),
                        INCREMENTO  = new NonTerminal("INCRE"),
                        CONDIFOR    = new NonTerminal("CONDI"),
                        ATRIBUTOS   = new NonTerminal("ATRIBUTOS"),
                        OPEREL      = new NonTerminal("OPEREL"),
                        TABU1       = new NonTerminal("TABU"),
                        DECLARACION = new NonTerminal("DECLARACION"),
                        LSENTENCIAS = new NonTerminal("LSENTENCIAS"),
                        TIPO2       = new NonTerminal("TIPO2"),
                        PARA        = new NonTerminal("PARA"),
                        PARAMETROS1 = new NonTerminal("PARAMETROS1"),
                        CUERPO      = new NonTerminal("CUERPO"),
                        CUERPO2     = new NonTerminal("CUERPO2"),
                        LCUERPO     = new NonTerminal("LCUERPO"),
                        DECG        = new NonTerminal("DECG"),
                        CONSTRUCTOR = new NonTerminal("CONSTRUCTOR"),
                        INSTANCIA   = new NonTerminal("INSTANCIA"),
                        SUPER       = new NonTerminal("SUPER"),
                        SELF        = new NonTerminal("SELF"),
                        ATRIBUTO    = new NonTerminal("ATRIBUTO"),
                        HERENCIA    = new NonTerminal("HERENCIA"),
                        MIENTRAS    = new NonTerminal("MIENTRAS"),
                        HACER       = new NonTerminal("HACER"),
                        REPETIR     = new NonTerminal("REPETIR"),
                        LOOP        = new NonTerminal("LOOP"),
                        MM          = new NonTerminal("MM"),
                        CONTINUAR   = new NonTerminal("CONTINUAR"),
                        TABU        = new NonTerminal("TABULACIONES"),
                        IMPORT      = new NonTerminal("IMPORT"),
                        IMPORT2     = new NonTerminal("IMPORT2"),
                        PATH        = new NonTerminal("PATH"),
                        PATH2       = new NonTerminal("PATH2"),
                        URL         = new NonTerminal("URL"),
                        TIPOA       = new NonTerminal("TIPOA"),
                        PARAF       = new NonTerminal("FOR"),
                        S1          = new NonTerminal("S1"),
                        LE          = new NonTerminal("LE"),
                        EC          = new NonTerminal("E"),
                        NATIVAS     = new NonTerminal("NATIVAS");



            #endregion

            #region Gramatica
            S.Rule = IMPORT + S1;

            S1.Rule = MakePlusRule(S1, CLASE);

            IMPORT.Rule = importar + IMPORT2 + Eos | Empty;

            IMPORT2.Rule = MakePlusRule(IMPORT2, ToTerm(","), PATH2);

            PATH2.Rule = url + dosp + division + division + ToTerm("mynube") + division + id + punto + TIPOA | id + punto + TIPOA | ToTerm("C") + dosp + sla + PATH + punto + TIPOA;

            TIPOA.Rule = ToTerm("olc") | ToTerm("tree");

            PATH.Rule = MakePlusRule(PATH, sla, id);

            CLASE.Rule = clase + id + corch1 + HERENCIA + corch2 + dosp + Eos + CUERPO2;

            HERENCIA.Rule = id | Empty;

            CUERPO2.Rule = Indent + LCUERPO + Dedent;

            LCUERPO.Rule = MakePlusRule(LCUERPO, CUERPO);

            CUERPO.Rule = METODOS | FUNCIONES | DECG | CONSTRUCTOR;

            PRIV.Rule = protegido | privado | publico | Empty;

            PARA.Rule = TIPO2 + id
                        | TIPO2 + id + corch1 + corch2;


            PARAMETROS.Rule = MakePlusRule(PARAMETROS, ToTerm(","), PARA) | Empty;

            CONSTRUCTOR.Rule = constructor + corch1 + PARAMETROS + corch2 + dosp + Eos + BLOQUE;

            FUNCIONES.Rule = PRIV + funcion + TIPO2 + id + corch1 + PARAMETROS + corch2 + dosp + Eos + BLOQUE;

            METODOS.Rule = PRIV + metodo + id + corch1 + PARAMETROS + corch2 + dosp + Eos + BLOQUE;

            BLOQUE.Rule = Indent + LSENTENCIAS + Dedent | Empty;

            LSENTENCIAS.Rule = MakeStarRule(LSENTENCIAS, SENTENCIA);

            SENTENCIA.Rule = DEC | ATRIBUTO + Eos | ASIGNACION | SELF | CICLOS | SALIR | CONTINUAR | NATIVAS + Eos | RET | MM + Eos | IMPRIMIR;

            SALIR.Rule = salir + Eos;

            CONTINUAR.Rule = continuar + Eos;

            LE.Rule = MakePlusRule(LE, ToTerm(","), E) | Empty;

            LLAMAR.Rule = id + corch1 + LE + corch2 + Eos;

            RET.Rule = retornar + E + Eos;

            INSTANCIA.Rule = nuevo + id + corch1 + LE + corch2;

            ASIGNACION.Rule = ATRIBUTO + ASG + Eos;

            SELF.Rule = self + punto + ATRIBUTO + ASG + Eos;

            SUPER.Rule = superr + punto + id;

            ATRIBUTO.Rule = MakePlusRule(ATRIBUTO, ToTerm("."), ATRIBUTOS) | SUPER;

            ATRIBUTOS.Rule = id | id + corch1 + EA + corch2 | id + LVEC;

            EA.Rule = MakePlusRule(EA, ToTerm(","), E) | Empty;

            ASG.Rule = igual + E | igual + INSTANCIA;

            CICLOS.Rule = IF | ELEGIR | PARAF | MIENTRAS | HACER | REPETIR | LOOP;

            IF.Rule = si + corch1 + COND + corch2 + dosp + Eos + BLOQUE + LELIF + ELSE;

            LELIF.Rule = MakePlusRule(LELIF, ELIF) | Empty;

            ELIF.Rule = sinosi + corch1 + COND + corch2 + dosp + Eos + BLOQUE | Empty;

            ELSE.Rule = sino1 + dosp + Eos + BLOQUE | Empty;

            ELEGIR.Rule = elegir + caso + corch1 + E + corch2 + dosp + Eos + Indent + CASO + DEF;

            CASO2.Rule = E + dosp + Eos + BLOQUE | Empty;

            DEF.Rule = defecto + dosp + Eos + BLOQUE + Dedent | Dedent;

            CASO.Rule = MakePlusRule(CASO, CASO2);

            MIENTRAS.Rule = mientras + corch1 + COND + corch2 + dosp + Eos + BLOQUE;

            HACER.Rule = hacer + dosp + Eos + BLOQUE + mientras + corch1 + COND + corch2 + Eos;

            REPETIR.Rule = repetir + dosp + Eos + BLOQUE + hasta + corch1 + COND + corch2 + Eos;

            PARAF.Rule = para + corch1 + intt + id + igual + E + dosp + COND + dosp + MM + corch2 + dosp + Eos + BLOQUE;

            MM.Rule = ATRIBUTO + masmas | ATRIBUTO + menmen;

            LOOP.Rule = loop + dosp + Eos + BLOQUE;

            IMPRIMIR.Rule = outs + corch1 + E + corch2 + Eos;


            NATIVAS.Rule = parseint + corch1 + E + corch2
                           | parsedo + corch1 + E + corch2
                           | doustr + corch1 + E + corch2
                           | douint + corch1 + E + corch2
                           | intstr + corch1 + E + corch2;

            DECG.Rule = PRIV + DEC | DEC;

            DEC.Rule = TIPO2 + DEC2 + DEC3 + Eos;

            DEC2.Rule = LID | id + LVEC;

            DEC3.Rule = igual + DEC4 | Empty;

            DEC4.Rule = E | INSTANCIA;

            LVEC1.Rule = corch1 + E + corch2;

            LVEC.Rule = MakePlusRule(LVEC, LVEC1);

            LID.Rule = MakePlusRule(LID, ToTerm(","), id);


            OPEREL.Rule = iguali
                          | mayor
                          | menor
                          | mayori
                          | menori
                          | distinto;

            E.Rule = E + E + OPEREL
                     | E + E + mas
                     | E + E + menos
                     | E + E + por
                     | E + E + division
                     | E + E + poten
                     | E + masmas
                     | E + menmen
                     | par1 + E + par2
                     | VALOR;

            COND.Rule = COND + COND + or
                        | COND + COND + and
                        | COND + COND + xor
                        | not + COND
                        | EC + EC + OPEREL
                        | VALOR;

            EC.Rule = EC + EC + mas
                      | EC + EC + menos
                      | EC + EC + por
                      | EC + EC + division
                      | EC + EC + poten
                      | VALOR;

            VALOR.Rule = numero
                         | deci
                         | str
                         | truee
                         | falsee
                         | ATRIBUTO
                         | NATIVAS
                         | self + punto + ATRIBUTO
                         | cha;

            TIPO.Rule = intt
                        | stringg
                        | charr
                        | booll
                        | doublee;
            TIPO2.Rule = TIPO
                         | id;

            #endregion

            #region Preferencias
            this.Root = S;
            this.NonGrammarTerminals.Add(comentarioLinea);
            this.NonGrammarTerminals.Add(comentarioBloque);
            this.MarkTransient(VALOR, PRIV, TIPO, TIPO2, SENTENCIA, CUERPO2, BLOQUE, CICLOS, CUERPO);
            this.RegisterOperators(2, Associativity.Left, mas, menos);
            this.RegisterOperators(3, Associativity.Left, por, division);
            this.RegisterOperators(4, Associativity.Left, poten);
            this.RegisterOperators(6, Associativity.Left, and);
            this.RegisterOperators(7, Associativity.Left, or);
            this.RegisterOperators(8, Associativity.Left, xor);
            this.RegisterOperators(9, Associativity.Left, not);
            this.RegisterOperators(10, Associativity.Left, iguali, distinto, mayor, menor, mayori, menori);
            this.MarkPunctuation(":", "__constructor", "=>", "self", ".", "~", "metodo", "funcion", "importar", "clase", "si", "si_no_si", "si_no", "elegir", "caso", "defecto", "mientras", "para", "hacer", "repetir", "hasta", "loop");
            #endregion
        }
Exemple #16
0
        //TerminalSet _skipTokensInPreview = new TerminalSet(); //used in token preview for conflict resolution
        public ExpressionGrammar()
        {
            //this.GrammarComments = "NOTE: This grammar is just a demo, and it is a broken demo.\r\n" +
            //                       "Demonstrates token preview technique to help parser resolve conflicts.\r\n";
            #region Lexical structure
            StringLiteral      StringLiteral = TerminalFactory.CreateCSharpString("StringLiteral");
            StringLiteral      CharLiteral   = TerminalFactory.CreateCSharpChar("CharLiteral");
            NumberLiteral      Number        = TerminalFactory.CreateCSharpNumber("Number");
            IdentifierTerminal identifier    = TerminalFactory.CreateCSharpIdentifier("Identifier");

            CommentTerminal SingleLineComment = new CommentTerminal("SingleLineComment", "//", "\r", "\n", "\u2085", "\u2028", "\u2029");
            CommentTerminal DelimitedComment  = new CommentTerminal("DelimitedComment", "/*", "*/");
            NonGrammarTerminals.Add(SingleLineComment);
            NonGrammarTerminals.Add(DelimitedComment);
            //Temporarily, treat preprocessor instructions like comments
            CommentTerminal ppInstruction = new CommentTerminal("ppInstruction", "#", "\n");
            NonGrammarTerminals.Add(ppInstruction);

            //Symbols
            Terminal    colon    = new Terminal(":"); //ToTerm(":", "colon");
            Terminal    semi     = ToTerm(";");       //, "semi");
            NonTerminal semi_opt = new NonTerminal("semi?");
            semi_opt.Rule = Empty | semi;
            Terminal    dot        = ToTerm("."); //, "dot");
            Terminal    comma      = ToTerm(","); //, "comma");
            NonTerminal comma_opt  = new NonTerminal("comma_opt", Empty | comma);
            NonTerminal commas_opt = new NonTerminal("commas_opt");
            commas_opt.Rule = MakeStarRule(commas_opt, null, comma);
            Terminal    qmark     = ToTerm("?");//, "qmark");
            NonTerminal qmark_opt = new NonTerminal("qmark_opt", Empty | qmark);
            Terminal    Lbr       = ToTerm("{");
            Terminal    Rbr       = ToTerm("}");
            Terminal    Lpar      = ToTerm("(");
            Terminal    Rpar      = ToTerm(")");
            Terminal    tgoto     = ToTerm("goto");
            Terminal    yld       = ToTerm("yield");

            Terminal Lparx = ToTerm("(*");
            #endregion

            #region NonTerminals
            //B.2.1. Basic concepts
            var qual_name_with_targs        = new NonTerminal("qual_name_with_targs");
            var base_type_list              = new NonTerminal("base_type_list");
            var generic_dimension_specifier = new NonTerminal("generic_dimension_specifier");
            var qual_name_segment           = new NonTerminal("qual_name_segment");
            var qual_name_segments_opt      = new NonTerminal("qual_name_segments_opt");
            var type_or_void          = new NonTerminal("type_or_void", "type or void");
            var builtin_type          = new NonTerminal("builtin_type", "built-in type");
            var type_ref_list         = new NonTerminal("type_ref_list");
            var identifier_ext        = new NonTerminal("identifier_ext");
            var identifier_or_builtin = new NonTerminal("identifier_or_builtin");

            //B.2.2. Types
            var type_ref                   = new NonTerminal("type_ref");
            var type_argument_list         = new NonTerminal("type_argument_list");
            var typearg_or_gendimspec_list = new NonTerminal("typearg_or_gendimspec_list");
            var type_argument_list_opt     = new NonTerminal("type_argument_list_opt");
            var integral_type              = new NonTerminal("integral_type");

            //B.2.4. Expressions
            var argument                  = new NonTerminal("argument");
            var argument_list             = new NonTerminal("argument_list");
            var argument_list_opt         = new NonTerminal("argument_list_opt");
            var expression                = new NonTerminal("expression", "expression");
            var expression_list           = new NonTerminal("expression_list");
            var expression_opt            = new NonTerminal("expression_opt");
            var conditional_expression    = new NonTerminal("conditional_expression");
            var lambda_expression         = new NonTerminal("lambda_expression");
            var query_expression          = new NonTerminal("query_expression");
            var unary_operator            = new NonTerminal("unary_operator");
            var assignment_operator       = new NonTerminal("assignment_operator");
            var primary_expression        = new NonTerminal("primary_expression");
            var unary_expression          = new NonTerminal("unary_expression");
            var pre_incr_decr_expression  = new NonTerminal("pre_incr_decr_expression");
            var post_incr_decr_expression = new NonTerminal("post_incr_decr_expression");
            var literal = new NonTerminal("literal");
            var parenthesized_expression   = new NonTerminal("parenthesized_expression");
            var member_access              = new NonTerminal("member_access");
            var member_access_segment      = new NonTerminal("member_access_segment");
            var member_access_segments_opt = new NonTerminal("member_access_segments_opt");
            var array_indexer              = new NonTerminal("array_indexer");
            var argument_list_par          = new NonTerminal("argument_list_par");
            var argument_list_par_opt      = new NonTerminal("argument_list_par_opt");
            var incr_or_decr                         = new NonTerminal("incr_or_decr");
            var incr_or_decr_opt                     = new NonTerminal("incr_or_decr_opt");
            var creation_args                        = new NonTerminal("creation_args");
            var object_creation_expression           = new NonTerminal("object_creation_expression");
            var anonymous_object_creation_expression = new NonTerminal("anonymous_object_creation_expression");
            var typeof_expression                    = new NonTerminal("typeof_expression");
            var checked_expression                   = new NonTerminal("checked_expression");
            var unchecked_expression                 = new NonTerminal("unchecked_expression");
            var default_value_expression             = new NonTerminal("default_value_expression");
            //var anonymous_method_expression = new NonTerminal("anonymous_method_expression");

            var elem_initializer          = new NonTerminal("elem_initializer");
            var elem_initializer_list     = new NonTerminal("elem_initializer_list");
            var elem_initializer_list_ext = new NonTerminal("elem_initializer_list_ext");
            var initializer_value         = new NonTerminal("initializer_value");

            var anonymous_object_initializer    = new NonTerminal("anonymous_object_initializer");
            var member_declarator               = new NonTerminal("member_declarator");
            var member_declarator_list          = new NonTerminal("member_declarator_list");
            var unbound_type_name               = new NonTerminal("unbound_type_name");
            var generic_dimension_specifier_opt = new NonTerminal("generic_dimension_specifier_opt");
            var bin_op_expression               = new NonTerminal("bin_op_expression");
            var typecast_expression             = new NonTerminal("typecast_expression");
            var bin_op = new NonTerminal("bin_op", "operator symbol");

            //B.2.5. Statements
            var statement             = new NonTerminal("statement", "statement");
            var statement_list        = new NonTerminal("statement_list");
            var statement_list_opt    = new NonTerminal("statement_list_opt");
            var declaration_statement = new NonTerminal("declaration_statement");
            var embedded_statement    = new NonTerminal("embedded_statement");
            var selection_statement   = new NonTerminal("selection_statement");
            var iteration_statement   = new NonTerminal("iteration_statement");
            var block = new NonTerminal("block");
            var statement_expression       = new NonTerminal("statement_expression");
            var statement_expression_list  = new NonTerminal("statement_expression_list");
            var local_variable_declaration = new NonTerminal("local_variable_declaration");
            //var local_constant_declaration = new NonTerminal("local_constant_declaration");
            var local_variable_type       = new NonTerminal("local_variable_type");
            var local_variable_declarator = new NonTerminal("local_variable_declarator");
            //var local_variable_declarators = new NonTerminal("local_variable_declarators");
            var if_statement        = new NonTerminal("if_statement");
            var else_clause_opt     = new NonTerminal("else_clause_opt");
            var while_statement     = new NonTerminal("while_statement");
            var do_statement        = new NonTerminal("do_statement");
            var for_statement       = new NonTerminal("for_statement");
            var for_initializer_opt = new NonTerminal("for_initializer_opt");
            var for_condition_opt   = new NonTerminal("for_condition_opt");
            var for_iterator_opt    = new NonTerminal("for_iterator_opt");
            var break_statement     = new NonTerminal("break_statement");
            var continue_statement  = new NonTerminal("continue_statement");
            var return_statement    = new NonTerminal("return_statement");
            var identifier_opt      = new NonTerminal("identifier_opt");

            var resource_acquisition = new NonTerminal("resource_acquisition");

            //namespaces, compilation units
            var qualified_identifier   = new NonTerminal("qualified_identifier");
            var qualified_alias_member = new NonTerminal("qualified_alias_member");

            //B.2.9. Arrays
            var rank_specifier       = new NonTerminal("rank_specifier");
            var rank_specifiers      = new NonTerminal("rank_specifiers");
            var rank_specifiers_opt  = new NonTerminal("rank_specifiers_opt");
            var dim_specifier        = new NonTerminal("dim_specifier");
            var dim_specifier_opt    = new NonTerminal("dim_specifier_opt");
            var list_initializer     = new NonTerminal("array_initializer");
            var list_initializer_opt = new NonTerminal("array_initializer_opt");



            var new_opt = new NonTerminal("new_opt");

            #endregion

            #region operators, punctuation and delimiters
            RegisterOperators(1, "||");
            RegisterOperators(2, "&&");
            RegisterOperators(3, "|");
            RegisterOperators(4, "^");
            RegisterOperators(5, "&");
            RegisterOperators(6, "==", "!=");
            RegisterOperators(7, "<", ">", "<=", ">=", "is", "as");
            RegisterOperators(8, "<<", ">>");
            RegisterOperators(9, "+", "-");
            RegisterOperators(10, "*", "/", "%");

            RegisterOperators(-3, "=", "+=", "-=", "*=", "/=", "%=", "&=", "|=", "^=", "<<=", ">>=");
            RegisterOperators(-2, "?");
            RegisterOperators(-1, "??");

            this.MarkPunctuation(";", ",", "(", ")", "{", "}", "[", "]", ":");
            //this.MarkTransient(/*namespace_member_declaration, member_declaration, type_declaration,*/ statement, embedded_statement, expression,
            //  literal, bin_op, primary_expression, expression);

            //this.AddTermsReportGroup("assignment", "=", "+=", "-=", "*=", "/=", "%=", "&=", "|=", "^=", "<<=", ">>=");
            //this.AddTermsReportGroup("typename", "bool", "decimal", "float", "double", "string", "object",
            //  "sbyte", "byte", "short", "ushort", "int", "uint", "long", "ulong", "char");
            //this.AddTermsReportGroup("statement", "if", "switch", "do", "while", "for", "foreach", "continue", "goto", "return", "try", "yield",
            //                                      "break", "throw", "unchecked", "using");
            //this.AddTermsReportGroup("type declaration", "public", "private", "protected", "static", "internal", "sealed", "abstract", "partial",
            //                                             "class", "struct", "delegate", "interface", "enum");
            //this.AddTermsReportGroup("member declaration", "virtual", "override", "readonly", "volatile", "extern");
            //this.AddTermsReportGroup("constant", Number, StringLiteral, CharLiteral);
            //this.AddTermsReportGroup("constant", "true", "false", "null");

            //this.AddTermsReportGroup("unary operator", "+", "-", "!", "~");

            //this.AddToNoReportGroup(comma, semi);
            //this.AddToNoReportGroup("var", "const", "new", "++", "--", "this", "base", "checked", "lock", "typeof", "default",
            //                         "{", "}", "[");

            //
            #endregion

            #region "<" conflict resolution
            //var gen_lt = new NonTerminal("gen_lt");
            //gen_lt.Rule = CustomActionHere(this.ResolveLessThanConflict) + "<";
            #endregion

            // RULES
            //B.2.1. Basic concepts
            //qual_name_with_targs is an alias for namespace-name, namespace-or-type-name, type-name,

            generic_dimension_specifier.Rule = /*gen_lt +*/ commas_opt + ">";
            qual_name_segments_opt.Rule      = MakeStarRule(qual_name_segments_opt, null, qual_name_segment);
            identifier_or_builtin.Rule       = identifier | builtin_type;
            identifier_ext.Rule    = identifier_or_builtin | "this" | "base";
            qual_name_segment.Rule = dot + identifier
                                     | "::" + identifier
                                     | type_argument_list;
            //generic_dimension_specifier.Rule = lt + commas_opt + ">";
            generic_dimension_specifier.Rule = /*gen_lt +*/ commas_opt + ">";
            qual_name_with_targs.Rule        = identifier_or_builtin + qual_name_segments_opt;

            type_argument_list.Rule         = /*gen_lt +*/ type_ref_list + ">";
            type_argument_list_opt.Rule     = Empty | type_argument_list;
            typearg_or_gendimspec_list.Rule = type_argument_list | generic_dimension_specifier_opt;

            //B.2.2. Types
            type_or_void.Rule = /*qual_name_with_targs |*/ "void";
            builtin_type.Rule = integral_type | "bool" | "decimal" | "float" | "double" | "string" | "object";

            type_ref.Rule      = type_or_void + qmark_opt + rank_specifiers_opt + typearg_or_gendimspec_list;
            type_ref_list.Rule = MakePlusRule(type_ref_list, comma, type_ref);

            var comma_list_opt = new NonTerminal("comma_list_opt");
            comma_list_opt.Rule      = MakeStarRule(comma_list_opt, null, comma);
            rank_specifier.Rule      = "[" + comma_list_opt + "]";
            rank_specifiers.Rule     = MakePlusRule(rank_specifiers, null, rank_specifier);
            rank_specifiers_opt.Rule = rank_specifiers.Q();
            integral_type.Rule       = ToTerm("sbyte") | "byte" | "short" | "ushort" | "int" | "uint" | "long" | "ulong" | "char";


            //B.2.4. Expressions
            argument.Rule          = expression | "ref" + identifier | "out" + identifier;
            argument_list.Rule     = MakePlusRule(argument_list, comma, argument);
            argument_list_opt.Rule = Empty | argument_list;
            expression.Rule        = conditional_expression
                                     | bin_op_expression
                                     | typecast_expression
                                     | primary_expression;
            expression_opt.Rule         = Empty | expression;
            expression_list.Rule        = MakePlusRule(expression_list, comma, expression);
            unary_operator.Rule         = ToTerm("+") | "-" | "!" | "~" | "*";
            assignment_operator.Rule    = ToTerm("=") | "+=" | "-=" | "*=" | "/=" | "%=" | "&=" | "|=" | "^=" | "<<=" | ">>=";
            conditional_expression.Rule = expression /*+ PreferShiftHere()*/ + qmark + expression + colon + expression;// + ReduceThis();
            bin_op_expression.Rule      = expression + bin_op + expression;

            typecast_expression.Rule = parenthesized_expression + primary_expression;
            primary_expression.Rule  =
                literal
                | unary_expression
                | parenthesized_expression
                | member_access
                | pre_incr_decr_expression
                | post_incr_decr_expression
                | object_creation_expression
                | anonymous_object_creation_expression
                | typeof_expression
                | checked_expression
                | unchecked_expression
                | default_value_expression
                /*| anonymous_method_expression*/;
            unary_expression.Rule          = unary_operator + primary_expression;
            dim_specifier.Rule             = "[" + expression_list + "]";
            dim_specifier_opt.Rule         = dim_specifier.Q();
            literal.Rule                   = Number | StringLiteral | CharLiteral | "true" | "false" | "null";
            parenthesized_expression.Rule  = Lpar + expression + Rpar;
            pre_incr_decr_expression.Rule  = incr_or_decr + member_access;
            post_incr_decr_expression.Rule = member_access + incr_or_decr;

            //joined invocation_expr and member_access; for member access left the most general variant
            member_access.Rule = identifier_ext + member_access_segments_opt;
            member_access_segments_opt.Rule = MakeStarRule(member_access_segments_opt, null, member_access_segment);
            member_access_segment.Rule      = dot + identifier
                                              | array_indexer
                                              | argument_list_par
                                              | type_argument_list;
            array_indexer.Rule = "[" + expression_list + "]";

            argument_list_par.Rule = Lpar + argument_list_opt + Rpar;

            argument_list_par_opt.Rule = Empty | argument_list_par;

            list_initializer.Rule     = Lbr + elem_initializer_list_ext + Rbr;
            list_initializer_opt.Rule = list_initializer.Q();

            elem_initializer.Rule          = initializer_value | identifier + "=" + initializer_value;
            elem_initializer_list.Rule     = MakePlusRule(elem_initializer_list, comma, elem_initializer);
            elem_initializer_list_ext.Rule = Empty | elem_initializer_list + comma_opt;
            initializer_value.Rule         = expression | list_initializer;

            //delegate, anon-object, object
            object_creation_expression.Rule = "new" + qual_name_with_targs + qmark_opt + creation_args + list_initializer_opt;
            creation_args.Rule = dim_specifier | rank_specifier | argument_list_par;

            anonymous_object_creation_expression.Rule = "new" + anonymous_object_initializer;
            anonymous_object_initializer.Rule         = Lbr + Rbr | Lbr + member_declarator_list + comma_opt + Rbr;
            member_declarator.Rule      = expression | identifier + "=" + expression;
            member_declarator_list.Rule = MakePlusRule(member_declarator_list, comma, member_declarator);
            //typeof
            typeof_expression.Rule = "typeof" + Lpar + type_ref + Rpar;
            generic_dimension_specifier_opt.Rule = Empty /*| gen_lt*/ + commas_opt + ">";
            //checked, unchecked
            checked_expression.Rule   = "checked" + parenthesized_expression;
            unchecked_expression.Rule = "unchecked" + parenthesized_expression;
            //default-value
            default_value_expression.Rule = "default" + Lpar + type_ref + Rpar;

            bin_op.Rule = ToTerm("<")
                          | "||" | "&&" | "|" | "^" | "&" | "==" | "!=" | ">" | "<=" | ">=" | "<<" | ">>" | "+" | "-" | "*" | "/" | "%"
                          | "=" | "+=" | "-=" | "*=" | "/=" | "%=" | "&=" | "|=" | "^=" | "<<=" | ">>="
                          | "is" | "as" | "??";

            //Queries
            query_expression.Rule = "from";

            //B.2.5. Statements
            statement.Rule                  = /*labeled_statement |*/ declaration_statement | embedded_statement;
            statement.ErrorRule             = SyntaxError + semi; //skip all until semicolon
            statement_list.Rule             = MakePlusRule(statement_list, null, statement);
            statement_list_opt.Rule         = Empty | statement_list;
            declaration_statement.Rule      = local_variable_declaration + semi /*| local_constant_declaration*/ + semi;
            local_variable_declaration.Rule = local_variable_type /*+ local_variable_declarators*/;
            local_variable_type.Rule        = member_access | "var"; // | builtin_type; //to fix the conflict, changing to member-access here
            local_variable_declarator.Rule  = identifier | identifier + "=" + initializer_value;
            //local_variable_declarators.Rule = MakePlusRule(local_variable_declarators, comma, local_variable_declarator);
            //local_constant_declaration.Rule = "const" + type_ref /*+ constant_declarators*/;
            //embedded_statement
            embedded_statement.Rule = block | semi /*empty_statement*/ | statement_expression + semi | selection_statement
                                      | iteration_statement /* | jump_statement | try_statement | checked_statement | unchecked_statement
                                                             | lock_statement | using_statement | yield_statement*/;
            block.Rule = Lbr + statement_list_opt + Rbr;
            //selection (if and switch)
            selection_statement.Rule = if_statement /*| switch_statement*/;
            if_statement.Rule        = ToTerm("if") + Lpar + expression + Rpar + embedded_statement + else_clause_opt;
            else_clause_opt.Rule     = Empty /*| PreferShiftHere()*/ + "else" + embedded_statement;
            iteration_statement.Rule = while_statement | do_statement | for_statement /*| foreach_statement*/;
            while_statement.Rule     = "while" + parenthesized_expression + embedded_statement;
            do_statement.Rule        = "do" + embedded_statement + "while" + parenthesized_expression + semi;
            for_statement.Rule       = "for" + Lpar + for_initializer_opt + semi + for_condition_opt + semi + for_iterator_opt + Rpar + embedded_statement;
            for_initializer_opt.Rule = Empty | local_variable_declaration | statement_expression_list;
            for_condition_opt.Rule   = Empty | expression;
            for_iterator_opt.Rule    = Empty | statement_expression_list;
            break_statement.Rule     = "break" + semi;
            continue_statement.Rule  = "continue" + semi;
            return_statement.Rule    = "return" + expression_opt + semi;
            identifier_opt.Rule      = Empty | identifier;

            resource_acquisition.Rule = local_variable_declaration | expression;

            statement_expression.Rule = object_creation_expression
                                        | member_access | member_access + assignment_operator + expression
                                        | pre_incr_decr_expression | post_incr_decr_expression
            ;
            statement_expression_list.Rule = MakePlusRule(statement_expression_list, comma, statement_expression);
            incr_or_decr_opt.Rule          = Empty | ToTerm("++") | "--";
            incr_or_decr.Rule = ToTerm("++") | "--";

            //B.2.6. Namespaces
            this.Root = block;
            qualified_identifier.Rule = MakePlusRule(qualified_identifier, dot, identifier);

            base_type_list.Rule = MakePlusRule(base_type_list, comma, qual_name_with_targs);

            new_opt.Rule = Empty | "new";

            //_skipTokensInPreview.UnionWith(new Terminal[] { dot, identifier, comma, ToTerm("::"), comma, ToTerm("["), ToTerm("]") });
        }
        public Language()
            : base(false)
        {
            CommentTerminal LINE_COMMENT  = new CommentTerminal("LINE_COMMENT", ">>", "\n", "\r\n");
            CommentTerminal BLOCK_COMMENT = new CommentTerminal("BLOCK_COMMENT", "<-", "->");

            NonGrammarTerminals.Add(BLOCK_COMMENT);
            NonGrammarTerminals.Add(LINE_COMMENT);

            ////----------------------------------Terminals with precedence
            KeyTerm increase         = ToTerm("++");
            KeyTerm decrease         = ToTerm("--");
            KeyTerm plus             = ToTerm("+");
            KeyTerm minus            = ToTerm("-");
            KeyTerm by               = ToTerm("*");
            KeyTerm divided          = ToTerm("/");
            KeyTerm power            = ToTerm("^");
            KeyTerm lessThan         = ToTerm("<");
            KeyTerm greaterThan      = ToTerm(">");
            KeyTerm lessThanEqual    = ToTerm("<=");
            KeyTerm greaterThanEqual = ToTerm(">=");
            KeyTerm doubleEqual      = ToTerm("==");
            KeyTerm different        = ToTerm("!=");
            KeyTerm not              = ToTerm("!");
            KeyTerm and              = ToTerm("&&");
            KeyTerm or               = ToTerm("||");

            ////----------------------------------precedence
            this.RegisterOperators(1, Associativity.Left, or);
            this.RegisterOperators(2, Associativity.Left, and);
            this.RegisterOperators(3, Associativity.Left, not);
            this.RegisterOperators(4, Associativity.Left, doubleEqual, different, lessThan, lessThanEqual, greaterThan, greaterThanEqual);
            this.RegisterOperators(5, Associativity.Left, plus, minus);
            this.RegisterOperators(6, Associativity.Left, by, divided);
            this.RegisterOperators(7, Associativity.Left, power);
            //Regex
            var integer  = new RegexBasedTerminal("int", "[0-9]+");
            var tdouble  = TerminalFactory.CreateCSharpNumber("double");
            var String   = TerminalFactory.CreateCSharpString("string");
            var caracter = TerminalFactory.CreateCSharpChar("char");
            var boolean  = new RegexBasedTerminal("bool", "(true)|(false)");
            var iden     = TerminalFactory.CreateCSharpIdentifier("id");
            var hexa     = new RegexBasedTerminal("hexa", "^(\\#)[0-9A-F]+$");
            //Non terminals
            var START               = new NonTerminal("START");
            var BODY                = new NonTerminal("BODY");
            var DECLARATION         = new NonTerminal("DECLARATION");
            var DECLARATION2        = new NonTerminal("DECLARATION2");
            var ASSIGNATION         = new NonTerminal("ASSIGNATION");
            var ASSIGN2             = new NonTerminal("ASSIGN2");
            var INDEX               = new NonTerminal("INDEX");
            var DATATYPE            = new NonTerminal("DATATYPE");
            var OBJECT              = new NonTerminal("OBJECT");
            var ASSIGN              = new NonTerminal("ASSIGN");
            var ARRAY               = new NonTerminal("ARRAY");
            var ARRAY2              = new NonTerminal("ARRAY2");
            var ARRAYASIGN          = new NonTerminal("ARRAYASIGN");
            var ARRAYASIGN2         = new NonTerminal("ARRAYASIGN2");
            var ARRAYASIGN3         = new NonTerminal("ARRAYASIGN3");
            var ARRAYLIST           = new NonTerminal("ARRAYLIST");
            var NATIVE              = new NonTerminal("NATIVE");
            var PRINT               = new NonTerminal("PRINT");
            var SHOW                = new NonTerminal("SHOW");
            var IF                  = new NonTerminal("IF");
            var ELSE                = new NonTerminal("ELSE");
            var FOR                 = new NonTerminal("FOR");
            var REPEAT              = new NonTerminal("REPEAT");
            var WHILE               = new NonTerminal("WHILE");
            var VARMANAGMENT        = new NonTerminal("VARMANAGMENT");
            var UPDATE              = new NonTerminal("UPDATE");
            var ESINGLE             = new NonTerminal("ESINGLE");
            var E                   = new NonTerminal("E");
            var ID                  = new NonTerminal("ID");
            var IDPLUS              = new NonTerminal("IDPLUS");
            var ARRAYS              = new NonTerminal("ARRAYS");
            var DOWHILE             = new NonTerminal("DOWHILE");
            var SWITCH              = new NonTerminal("SWITCH");
            var CASE                = new NonTerminal("CASE");
            var DEFAULT             = new NonTerminal("DEFAULT");
            var CASELIST            = new NonTerminal("CASELIST");
            var FUNCTION            = new NonTerminal("FUNCTION");
            var FUNCTIONARGS        = new NonTerminal("FUNCTIONARGS");
            var VISIBILITY          = new NonTerminal("VISIBILITY");
            var OVERRIDE            = new NonTerminal("OVERRIDE");
            var PARAMLIST           = new NonTerminal("PARAMLIST");
            var PARAM               = new NonTerminal("PARAM");
            var OPTIONAL            = new NonTerminal("OPTIONAL");
            var RETURN              = new NonTerminal("RETURN");
            var RETOPTION           = new NonTerminal("RETOPTION");
            var LISTMETHODS         = new NonTerminal("LISTMETHODS");
            var CLASS               = new NonTerminal("CLASS");
            var EXTENDS             = new NonTerminal("EXTENDS");
            var EXTENDSLIST         = new NonTerminal("EXTENDSLIST");
            var CALLFUNC            = new NonTerminal("CALLFUNC");
            var ADDFIGURE           = new NonTerminal("ADDFIGURE");
            var GEOMETRICAS         = new NonTerminal("GEOMETRICAS");
            var COLOR               = new NonTerminal("COLOR");
            var FIGURE              = new NonTerminal("FIGURE");
            var MAIN                = new NonTerminal("MAIN");
            var CLASSIMPLEMENTATION = new NonTerminal("CLASSIMPLEMENTATION");
            var CFUNCLIST           = new NonTerminal("CFUNCLIST");
            var LISTCLASSMETHODS    = new NonTerminal("LISTCLASSMETHODS");
            var LISTCLASSMETHODS2   = new NonTerminal("LISTCLASSMETHODS2");
            var LISTOBJECTS         = new NonTerminal("LISTCLASSMETHODS2");

            ////----------------------------------Innecesary nodes
            this.MarkPunctuation(".", "(", ")", "{", "}", "[", "]", ";", "=", ",", "importar", "if", "for", "repeat", "mientras", "show", "hacer", "comprobar", "salir", "caso", ":", "print", "defecto", "clase", "addfigure", "main", "return");
            this.MarkTransient(DECLARATION2, LISTCLASSMETHODS2, CLASSIMPLEMENTATION, BODY, ASSIGN2, COLOR, ARRAY2, ARRAYASIGN, ARRAYASIGN2, ARRAYASIGN3, NATIVE, VARMANAGMENT, ESINGLE, ASSIGN, ARRAY, ADDFIGURE, RETOPTION);
            //----------------------------------Grammar
            START.Rule = MakePlusRule(START, CLASS);
            CLASS.Rule = "clase" + iden + EXTENDSLIST + "{" + CLASSIMPLEMENTATION + "}";

            CLASS.ErrorRule = SyntaxError + "}";
            CLASS.ErrorRule = SyntaxError + ";";

            CLASSIMPLEMENTATION.Rule = MakeStarRule(CLASSIMPLEMENTATION, LISTCLASSMETHODS);
            EXTENDSLIST.Rule         = MakeStarRule(EXTENDSLIST, ToTerm(","), EXTENDS);
            EXTENDS.Rule             = ToTerm("importar") + ID;
            LISTMETHODS.Rule         = MakePlusRule(LISTMETHODS, BODY);
            BODY.Rule = ID + ";" | FIGURE | ADDFIGURE | DECLARATION | ASSIGNATION | UPDATE + ";" | PRINT | SHOW | IF | FOR | REPEAT | WHILE | DOWHILE | SWITCH | OPTIONAL + ";" | Empty | CALLFUNC;
            //methods inside a function
            DECLARATION.Rule = DATATYPE + DECLARATION2 + ";";

            DECLARATION.ErrorRule = SyntaxError + ";";

            DECLARATION2.Rule = LISTOBJECTS | ToTerm("array") + ARRAYS;
            LISTOBJECTS.Rule  = MakePlusRule(LISTOBJECTS, ToTerm(","), OBJECT);
            ARRAYS.Rule       = ID + ARRAY;
            ASSIGN.Rule       = ToTerm("=") + E | Empty;
            ASSIGNATION.Rule  = ID + ASSIGN2 + ";";

            ASSIGNATION.ErrorRule = SyntaxError + ";";


            ASSIGN2.Rule = ToTerm("=") + E | "[" + E + "]" + ASSIGN2;
            PRINT.Rule   = ToTerm("print") + "(" + E + ")" + ";";

            PRINT.ErrorRule = SyntaxError + ";";

            SHOW.Rule = ToTerm("show") + "(" + E + "," + E + ")" + ";";

            SHOW.ErrorRule = SyntaxError + ";";

            IF.Rule = ToTerm("if") + "(" + E + ")" + "{" + LISTMETHODS + "}" + ELSE;

            IF.ErrorRule = SyntaxError + "}";
            IF.ErrorRule = SyntaxError + ";";

            ELSE.Rule = ToTerm("else") + IF | ToTerm("else") + "{" + LISTMETHODS + "}" | Empty;
            FOR.Rule  = ToTerm("for") + "(" + VARMANAGMENT + E + ";" + UPDATE + ")" + "{" + LISTMETHODS + "}";

            FOR.ErrorRule = SyntaxError + "}";
            FOR.ErrorRule = SyntaxError + ";";

            REPEAT.Rule = ToTerm("repeat") + "(" + E + ")" + "{" + LISTMETHODS + "}";

            REPEAT.ErrorRule = SyntaxError + "}";
            REPEAT.ErrorRule = SyntaxError + ";";

            VARMANAGMENT.Rule = DECLARATION | ASSIGNATION;
            UPDATE.Rule       = ESINGLE + increase | ESINGLE + decrease;
            WHILE.Rule        = ToTerm("mientras") + "(" + E + ")" + "{" + LISTMETHODS + "}";

            WHILE.ErrorRule = SyntaxError + "}";
            WHILE.ErrorRule = SyntaxError + ";";

            DOWHILE.Rule = ToTerm("hacer") + "{" + LISTMETHODS + "}" + ToTerm("mientras") + "(" + E + ")" + ";";

            DOWHILE.ErrorRule = SyntaxError + "}";
            DOWHILE.ErrorRule = SyntaxError + ";";

            SWITCH.Rule        = ToTerm("comprobar") + "(" + E + ")" + "{" + CASELIST + DEFAULT + "}";
            SWITCH.ErrorRule   = SyntaxError + "}";
            SWITCH.ErrorRule   = SyntaxError + ";";
            CASELIST.Rule      = MakePlusRule(CASELIST, CASE);
            CASE.Rule          = ToTerm("caso") + E + ":" + LISTMETHODS + ToTerm("salir") + ";";
            DEFAULT.Rule       = ToTerm("defecto") + ":" + LISTMETHODS + ToTerm("salir") + ";" | Empty;
            OPTIONAL.Rule      = RETURN | ToTerm("continue");
            RETURN.Rule        = ToTerm("return") + RETOPTION;
            RETOPTION.Rule     = Empty | E;
            CALLFUNC.Rule      = iden + "(" + CFUNCLIST + ")" + ";";
            CFUNCLIST.Rule     = MakeStarRule(CFUNCLIST, ToTerm(","), E);
            CALLFUNC.ErrorRule = SyntaxError + ";";
            ADDFIGURE.Rule     = ToTerm("addfigure") + "(" + GEOMETRICAS + ")" + ";";
            GEOMETRICAS.Rule   = ToTerm("circle") + "(" + COLOR + "," + E + "," + E + "," + E + "," + E + ")"
                                 | ToTerm("triangle") + "(" + COLOR + "," + E + "," + E + "," + E + "," + E + "," + E + "," + E + "," + E + ")"
                                 | ToTerm("square") + "(" + COLOR + "," + E + "," + E + "," + E + "," + E + "," + E + ")"
                                 | ToTerm("line") + "(" + COLOR + "," + E + "," + E + "," + E + "," + E + "," + E + ")";
            GEOMETRICAS.ErrorRule = SyntaxError + ";";

            COLOR.Rule  = Empty | E; //it can be a string or id
            FIGURE.Rule = ToTerm("figure") + "(" + E + ")" + ";";
            //Methods inside a class
            LISTCLASSMETHODS.Rule  = VISIBILITY + LISTCLASSMETHODS2 | MAIN;
            LISTCLASSMETHODS2.Rule = DECLARATION | FUNCTION;
            MAIN.Rule     = ToTerm("main") + "(" + ")" + "{" + LISTMETHODS + "}";
            FUNCTION.Rule = iden + FUNCTIONARGS + "(" + PARAMLIST + ")" + "{" + LISTMETHODS + "}";

            FUNCTION.ErrorRule = SyntaxError + "}";
            FUNCTION.ErrorRule = SyntaxError + ";";


            FUNCTIONARGS.Rule = DATATYPE + OVERRIDE | ToTerm("array") + DATATYPE + INDEX + OVERRIDE | ToTerm("void");
            VISIBILITY.Rule   = Empty | ToTerm("publico") | ToTerm("privado");
            OVERRIDE.Rule     = Empty | ToTerm("override");
            PARAMLIST.Rule    = MakeStarRule(PARAMLIST, ToTerm(","), PARAM);
            PARAM.Rule        = iden + iden | DATATYPE + iden;
            //datatypes
            DATATYPE.Rule = ToTerm("int") | "bool" | "string" | "double" | "char" | iden;
            OBJECT.Rule   = ID + ASSIGN;
            //Making arrays
            ARRAY.Rule       = "=" + ARRAYASIGN | Empty;
            ARRAYASIGN.Rule  = ToTerm("{") + ARRAYASIGN2 + "}";
            ARRAYASIGN2.Rule = ARRAYASIGN3 | ARRAYLIST;
            ARRAYASIGN3.Rule = ARRAYASIGN | MakePlusRule(ARRAYASIGN3, ToTerm(","), ARRAYASIGN);
            ARRAYLIST.Rule   = MakePlusRule(ARRAYLIST, ToTerm(","), E);
            //Making EXP
            E.Rule = E + plus + E
                     | E + minus + E
                     | E + by + E
                     | E + divided + E
                     | E + power + E
                     | E + doubleEqual + E
                     | E + different + E
                     | E + lessThan + E
                     | E + greaterThan + E
                     | E + lessThanEqual + E
                     | E + greaterThanEqual + E
                     | E + or + E
                     | E + and + E
                     | not + E
                     | ESINGLE
                     | ToTerm("(") + E + ")"
                     | minus + E;

            ESINGLE.Rule = NATIVE | ID | ToTerm("new") + iden + "(" + CFUNCLIST + ")";
            INDEX.Rule   = INDEX + ToTerm("[") + E + "]" | Empty;
            ID.Rule      = iden + IDPLUS;
            IDPLUS.Rule  = INDEX | Empty | "(" + CFUNCLIST + ")" | "." + ID;
            NATIVE.Rule  = integer | caracter | String | boolean | tdouble;
            this.Root    = START;
        }
        public Gramatica() : base(caseSensitive: true)
        {
            #region ER
            var numero                = TerminalFactory.CreateCSharpNumber("numero");
            IdentifierTerminal id     = new IdentifierTerminal("id");
            StringLiteral      cadena = TerminalFactory.CreateCSharpString("cadena");
            var caracter              = TerminalFactory.CreateCSharpChar("caracter");
            #endregion

            #region Terminales
            /*  OPERADORES ARITMETICOS  */
            var mas   = ToTerm("+");
            var menos = ToTerm("-");
            var por   = ToTerm("*");
            var div   = ToTerm("/");
            /*  OPERADORES COMPARAR   */
            var igual       = ToTerm("==");
            var menor       = ToTerm("<");
            var mayor       = ToTerm(">");
            var menor_igual = ToTerm("<=");
            var mayor_igual = ToTerm(">=");
            var diferente   = ToTerm("!=");

            /*  OPERADORES LOGICOS
             * var or = ToTerm("||");
             * var and = ToTerm("&&");
             * var not = ToTerm("!");
             * var nand = ToTerm("!&&");
             * var nor = ToTerm("!||");
             * var xor = ToTerm("|&"); */
            /*  TIPOS DE DATOS  */
            var tipo_cadena   = ToTerm("cadena");
            var tipo_caracter = ToTerm("caracter");
            var tipo_entero   = ToTerm("entero");
            var tipo_doble    = ToTerm("doble");
            var tipo_bool     = ToTerm("boolean");
            /*  SENTENCIAS DE CONTROL   */
            var sentencia_si       = ToTerm("si");
            var sentencia_sino     = ToTerm("sino");
            var sentencia_para     = ToTerm("para");
            var sentencia_mientras = ToTerm("mientras");
            var sentencia_hacer    = ToTerm("hacer");

            #endregion

            #region No Terminales
            NonTerminal S           = new NonTerminal("S"),
                        PROGRAMA    = new NonTerminal("PROGRAMA"),
                        SENTENCIA   = new NonTerminal("SENTENCIA"),
                        CONDICION   = new NonTerminal("CONDICION"),
                        INICIO_PARA = new NonTerminal("INICIO PARA"),
                        FIN_PARA    = new NonTerminal("FIN PARA"),
                        SI          = new NonTerminal("SI"),
                        SINO        = new NonTerminal("SINO"),
                        PARA        = new NonTerminal("PARA"),
                        MIENTRAS    = new NonTerminal("MIENTRAS"),
                        HACER       = new NonTerminal("HACER"),
                        L_ID        = new NonTerminal("LST ID"),
                        ASIGNACION  = new NonTerminal("ASIGNACION"),
                        COMPARACION = new NonTerminal("COMPARACION"),
                        DECLARACION = new NonTerminal("DECLARAR"),
                        COMPARAR    = new NonTerminal("COMPARAR"),
                        TIPO        = new NonTerminal("TIPO"),
                        E           = new NonTerminal("E");

            #endregion

            #region Gramatica
            S.Rule = PROGRAMA;

            PROGRAMA.Rule = MakePlusRule(PROGRAMA, SENTENCIA);

            SENTENCIA.Rule = SI | PARA | MIENTRAS | HACER | ASIGNACION;

            /*
             * si ( CONDICION ) ¿ SENTENCIA ? sino ¿ SENTENCIA ?
             * para ( INICIO_PARA ; FIN_PARA; CONDICION) ¿ SENTENCIA ?
             * mientras ( CONDICION ) ¿ SENTENCIA ?
             * hacer ¿ SENTENCIA ? mientras ( CONDICION ) $
             */
            SI.Rule = sentencia_si + ToTerm("(") + COMPARACION + ToTerm(")") +
                      ToTerm("¿") + SENTENCIA + ToTerm("?") +
                      sentencia_sino + ToTerm("¿") + SENTENCIA + ToTerm("?");

            PARA.Rule = sentencia_para + ToTerm("(") + ASIGNACION + ToTerm(";") + COMPARACION + ToTerm(";") + COMPARACION + ToTerm(")") +
                        ToTerm("¿") + SENTENCIA + ToTerm("?");

            MIENTRAS.Rule = sentencia_mientras + ToTerm("(") + COMPARACION + ToTerm(")") +
                            ToTerm("¿") + SENTENCIA + ToTerm("?");

            HACER.Rule = sentencia_hacer + ToTerm("¿") + SENTENCIA + ToTerm("?") +
                         sentencia_mientras + ToTerm("(") + COMPARACION + ToTerm(")") + ToTerm("$");

            /*
             * CONDICION -> COMPARACION
             * INICIO_PARA -> ASIGNACION
             * FIN_PARA  -> COMPARACION
             */
            ASIGNACION.Rule = DECLARACION + ToTerm("=") + E + ToTerm("$");

            DECLARACION.Rule = TIPO + id;

            COMPARACION.Rule = E + COMPARAR + E;

            TIPO.Rule = tipo_cadena | tipo_caracter | tipo_doble | tipo_entero | tipo_bool;

            COMPARAR.Rule = igual | menor | mayor | menor_igual | mayor_igual | diferente;

            E.Rule = E + mas + E
                     | E + menos + E
                     | E + por + E
                     | E + div + E
                     | ToTerm("(") + E + ToTerm(")")
                     | numero
                     | id
                     | cadena
                     | caracter;

            #endregion

            #region Preferencias
            this.Root = S;

            this.RegisterOperators(20, Associativity.Left, mas, menos);
            this.RegisterOperators(30, Associativity.Left, por, div);

            this.MarkPunctuation("(", ")", ",", ";", "=", "¿", "?", "$");

            this.MarkTransient(S, SENTENCIA, TIPO);

            #endregion
        }
Exemple #19
0
        public Gramaticao() : base(caseSensitive: true)
        {
            #region ER
            RegexBasedTerminal numero = new RegexBasedTerminal("numero", "[0-9]+");
            RegexBasedTerminal deci   = new RegexBasedTerminal("decimal", "[0-9]+[.][0-9]+");
            IdentifierTerminal id     = new IdentifierTerminal("id");
            CommentTerminal    str    = new CommentTerminal("cadena", "\"", "\"");


            CommentTerminal comentarioLinea  = new CommentTerminal("comentarioLinea", "//", "\n");
            CommentTerminal comentarioBloque = new CommentTerminal("comentarioBloque", "/-", "-/");
            StringLiteral   cha = TerminalFactory.CreateCSharpChar("caracter");



            #endregion

            #region Terminales

            var url       = ToTerm("http");
            var heredar   = ToTerm("hereda_de");
            var sla       = ToTerm("~");
            var pt        = ToTerm(";");
            var dosp      = ToTerm(":");
            var par1      = ToTerm("(");
            var par2      = ToTerm(")");
            var principal = ToTerm("principal");
            var intt      = ToTerm("entero");
            var stringg   = ToTerm("cadena");
            var doublee   = ToTerm("decimal");
            var charr     = ToTerm("caracter");
            var booll     = ToTerm("booleano");
            var mas       = ToTerm("+");
            var menos     = ToTerm("-");
            var por       = ToTerm("*");
            var division  = ToTerm("/");
            var poten     = ToTerm("pow");
            var publico   = ToTerm("publico");
            var protegido = ToTerm("protegido");
            var privado   = ToTerm("privado");
            var corch1    = ToTerm("[");
            var corch2    = ToTerm("]");
            var llave1    = ToTerm("{");
            var llave2    = ToTerm("}");
            var truee     = ToTerm("true");
            var falsee    = ToTerm("false");
            var and       = ToTerm("and");
            var or        = ToTerm("or");
            var not       = ToTerm("not");
            var xor       = ToTerm("xor");
            var mayor     = ToTerm(">");
            var menor     = ToTerm("<");
            var mayori    = ToTerm(">=");
            var menori    = ToTerm("<=");
            var iguali    = ToTerm("==");
            var distinto  = ToTerm("!=");
            var imprimir  = ToTerm("imprimir");
            var metodo    = ToTerm("metodo");
            var funcion   = ToTerm("funcion");
            var retornar  = ToTerm("retorno");
            var clase     = ToTerm("clase");
            var nuevo     = ToTerm("nuevo");
            var si        = ToTerm("Si");
            var sino      = ToTerm("Sino");
            var caso      = ToTerm("caso");
            var defecto   = ToTerm("defecto");
            var mientras  = ToTerm("Mientras");
            var hacer     = ToTerm("hacer");
            var salir     = ToTerm("salir");
            var continuar = ToTerm("continuar");
            var repetir   = ToTerm("Repetir");
            var hasta     = ToTerm("until");
            var x         = ToTerm("X");
            var para      = ToTerm("Para");
            var masmas    = ToTerm("++");
            var menmen    = ToTerm("--");
            var igual     = ToTerm("=");
            var superr    = ToTerm("super");
            var importar  = ToTerm("importar");
            var self      = ToTerm("este");
            var elegir    = ToTerm("elegir");
            var llamar    = ToTerm("llamar");

            #endregion

            #region No Terminales
            NonTerminal S          = new NonTerminal("S"),
                        E          = new NonTerminal("E"),
                        DECGF      = new NonTerminal("DECGF"),
                        BLOQUE     = new NonTerminal("BLOQUE"),
                        SENTENCIA  = new NonTerminal("SENTENCIA"),
                        MOSTRAR    = new NonTerminal("MOSTRAR"),
                        LID        = new NonTerminal("LID"),
                        LVEC       = new NonTerminal("LVEC"),
                        LVEC1      = new NonTerminal("LVEC1"),
                        TIPO       = new NonTerminal("TIPO"),
                        VALOR      = new NonTerminal("VALOR"),
                        CLASE      = new NonTerminal("CLASE"),
                        FUNCIONES  = new NonTerminal("FUNCIONES"),
                        CFUN       = new NonTerminal("CFUN"),
                        LLAMAR     = new NonTerminal("LLAMAR"),
                        ASG        = new NonTerminal("ASIGNAR"),
                        ENTERES    = new NonTerminal("ENTERES"),
                        PARAMETROS = new NonTerminal("PARAMETROS"),
                        CFUNCIONES = new NonTerminal("CFUNCIONES"),
                        DEC        = new NonTerminal("DEC"),
                        DEC2       = new NonTerminal("DEC2"),
                        DECV       = new NonTerminal("DECV"),
                        DECV1      = new NonTerminal("DECV1"),
                        PRIV       = new NonTerminal("PRIVACIADA"),
                        IMPRESION  = new NonTerminal("IMPRESION"),
                        IFC        = new NonTerminal("IFC"),
                        LLAMADA    = new NonTerminal("LLAMADA"),

                        IF          = new NonTerminal("IF"),
                        FOR         = new NonTerminal("FOR"),
                        ASIGNACION  = new NonTerminal("ASIGNACION"),
                        METODOS     = new NonTerminal("METODOS"),
                        PRINCIPAL   = new NonTerminal("PRINCIPAL"),
                        LELIF       = new NonTerminal("LELIF"),
                        ELIF        = new NonTerminal("ELIF"),
                        ELSE        = new NonTerminal("ELSE"),
                        COND        = new NonTerminal("COND"),
                        ELEGIR      = new NonTerminal("ELEGIR"),
                        CASO        = new NonTerminal("CASO"),
                        CASO2       = new NonTerminal("CASO2"),
                        DEF         = new NonTerminal("DEF"),
                        RET         = new NonTerminal("RET"),
                        CICLOS      = new NonTerminal("CICLOS"),
                        SAL         = new NonTerminal("SAL"),
                        WHILE       = new NonTerminal("WHILE"),
                        DOWHILE     = new NonTerminal("DO"),
                        INCREMENTO  = new NonTerminal("INCRE"),
                        CONDIFOR    = new NonTerminal("CONDI"),
                        ATRIBUTOS   = new NonTerminal("ATRIBUTOS"),
                        ATRIBUTO1   = new NonTerminal("ATRIBUTO1"),
                        ATRIO       = new NonTerminal("ATRIO"),
                        OPEREL      = new NonTerminal("OPEREL"),
                        TABU1       = new NonTerminal("TABU"),
                        DECLARACION = new NonTerminal("DECLARACION"),
                        LSENTENCIAS = new NonTerminal("LSENTENCIAS"),
                        TIPO2       = new NonTerminal("TIPO2"),
                        PARA        = new NonTerminal("PARA"),
                        PARAMETROS1 = new NonTerminal("PARAMETROS1"),
                        CUERPO      = new NonTerminal("CUERPO"),
                        CUERPO2     = new NonTerminal("CUERPO2"),
                        LCUERPO     = new NonTerminal("LCUERPO"),
                        DECG        = new NonTerminal("DECG"),
                        CONSTRUCTOR = new NonTerminal("CONSTRUCTOR"),
                        INSTANCIA   = new NonTerminal("INSTANCIA"),
                        SUPER       = new NonTerminal("SUPER"),
                        SELF        = new NonTerminal("SELF"),
                        ATRIBUTO    = new NonTerminal("ATRIBUTO"),
                        HERENCIA    = new NonTerminal("HERENCIA"),
                        MIENTRAS    = new NonTerminal("MIENTRAS"),
                        HACER       = new NonTerminal("HACER"),
                        REPETIR     = new NonTerminal("REPETIR"),
                        LOOP        = new NonTerminal("X"),
                        MM          = new NonTerminal("MM"),
                        TABU        = new NonTerminal("TABULACIONES"),
                        IMPORT      = new NonTerminal("IMPORT"),
                        IMPORT2     = new NonTerminal("IMPORT2"),
                        PATH        = new NonTerminal("PATH"),
                        PATH2       = new NonTerminal("PATH2"),
                        URL         = new NonTerminal("URL"),
                        TIPOA       = new NonTerminal("TIPOA"),
                        PARAF       = new NonTerminal("FOR"),
                        S1          = new NonTerminal("S1"),
                        EA          = new NonTerminal("EA"),
                        VALA        = new NonTerminal("VALA"),
                        VALA2       = new NonTerminal("VALA2"),
                        LE          = new NonTerminal("LE"),
                        DEC3        = new NonTerminal("DEC3"),
                        DEC4        = new NonTerminal("DEC"),
                        DEC5        = new NonTerminal("DEC5"),
                        EC          = new NonTerminal("E"),
                        NATIVAS     = new NonTerminal("NATIVAS");

            #endregion

            #region Gramatica
            S.Rule = IMPORT2 + S1;

            S1.Rule = MakePlusRule(S1, CLASE);

            IMPORT2.Rule = MakePlusRule(IMPORT2, IMPORT) | Empty;

            IMPORT.Rule = importar + par1 + str + par2 + pt | llamar + par1 + str + par2 + pt;

            TIPOA.Rule = ToTerm("olc") | ToTerm("tree");

            PATH.Rule = MakePlusRule(PATH, sla, id);

            CLASE.Rule = clase + id + HERENCIA + llave1 + LCUERPO + llave2;

            HERENCIA.Rule = heredar + id | Empty;

            LCUERPO.Rule = MakePlusRule(LCUERPO, CUERPO);

            PRINCIPAL.Rule = principal + par1 + par2 + llave1 + BLOQUE + llave2;

            CUERPO.Rule = METODOS | DECGF | CONSTRUCTOR | PRINCIPAL;

            PRIV.Rule = protegido | privado | publico | Empty;


            PARA.Rule = TIPO2 + id
                        | TIPO2 + id + LVEC;

            PARAMETROS.Rule = MakePlusRule(PARAMETROS, ToTerm(","), PARA) | Empty;

            CONSTRUCTOR.Rule = id + par1 + PARAMETROS + par2 + llave1 + BLOQUE + llave2;

            FUNCIONES.Rule = par1 + PARAMETROS + par2 + llave1 + BLOQUE + llave2;

            METODOS.Rule = PRIV + metodo + id + par1 + PARAMETROS + par2 + llave1 + BLOQUE + llave2;

            BLOQUE.Rule = MakeStarRule(BLOQUE, SENTENCIA);

            SENTENCIA.Rule = DEC | ATRIBUTO + pt | LLAMADA + pt | ASIGNACION | SELF | CICLOS | MM + pt | salir + pt | continuar + pt | RET | IMPRESION;

            LLAMADA.Rule = id + par1 + LE + par2;

            RET.Rule = retornar + E + pt;

            INSTANCIA.Rule = nuevo + id + par1 + LE + par2;

            IMPRESION.Rule = imprimir + par1 + E + par2 + pt;


            ASIGNACION.Rule = ATRIBUTO + ASG + pt;

            SELF.Rule = self + ToTerm(".") + ATRIBUTO + ASG + pt;


            ATRIBUTO.Rule = MakePlusRule(ATRIBUTO, ToTerm("."), ATRIBUTOS);

            ATRIBUTOS.Rule = id | id + par1 + EA + par2 | id + LVEC;

            EA.Rule = LE | Empty;

            ASG.Rule = igual + E | igual + INSTANCIA;


            CICLOS.Rule = IF | PARAF | MIENTRAS | HACER | REPETIR | LOOP;

            IF.Rule = si + par1 + COND + par2 + llave1 + BLOQUE + llave2 + LELIF;

            LELIF.Rule = MakePlusRule(LELIF, ELIF) | Empty;

            ELIF.Rule = sino + si + par1 + COND + par2 + llave1 + BLOQUE + llave2 | sino + llave1 + BLOQUE + llave2;


            ELEGIR.Rule = elegir + caso + corch1 + E + corch2 + dosp + CASO + DEF;

            CASO2.Rule = E + dosp + BLOQUE;

            DEF.Rule = defecto + dosp + BLOQUE;

            CASO.Rule = MakePlusRule(CASO, CASO2);

            MIENTRAS.Rule = mientras + par1 + COND + par2 + llave1 + BLOQUE + llave2;

            HACER.Rule = hacer + llave1 + BLOQUE + llave2 + mientras + par1 + COND + par2 + pt;

            REPETIR.Rule = repetir + llave1 + BLOQUE + llave2 + hasta + par1 + COND + par2 + pt;

            PARAF.Rule = para + par1 + intt + id + igual + E + pt + COND + pt + MM + par2 + llave1 + BLOQUE + llave2;

            MM.Rule = ATRIBUTO + masmas | ATRIBUTO + menmen;

            LOOP.Rule = x + par1 + COND + ToTerm(",") + COND + par2 + llave1 + BLOQUE + llave2;


            DECGF.Rule = PRIV + TIPO2 + id + (DECG | FUNCIONES);

            DEC3.Rule = ToTerm(",") + LID | LVEC | Empty;

            DEC5.Rule = E | VALA | INSTANCIA;

            DEC4.Rule = igual + DEC5 | Empty;

            DECG.Rule = DEC3 + DEC4 + pt | LVEC + DEC4 + pt;

            LE.Rule = MakePlusRule(LE, ToTerm(","), E) | Empty;

            VALA.Rule = MakePlusRule(VALA, ToTerm(","), VALA2);

            VALA2.Rule = llave1 + LE + llave2 | llave1 + VALA + llave2;

            DEC.Rule = TIPO2 + DEC2 + DEC4 + pt;

            DEC2.Rule = LID | id + LVEC;

            LVEC1.Rule = corch1 + E + corch2;

            LVEC.Rule = MakePlusRule(LVEC, LVEC1);

            LID.Rule = MakePlusRule(LID, ToTerm(","), id);


            OPEREL.Rule = iguali
                          | mayor
                          | menor
                          | mayori
                          | menori
                          | distinto;

            E.Rule =
                E + OPEREL + E
                | E + mas + E
                | E + menos + E
                | E + por + E
                | E + division + E
                | E + poten + E
                | E + masmas
                | E + menmen
                | par1 + E + par2
                | VALOR;

            COND.Rule = COND + or + COND
                        | COND + and + COND
                        | COND + xor + COND
                        | not + COND
                        | EC + OPEREL + EC
                        | VALOR;

            EC.Rule = EC + mas + EC
                      | EC + menos + EC
                      | EC + por + EC
                      | EC + division + EC
                      | EC + poten + EC
                      | VALOR;

            VALOR.Rule = numero
                         | deci
                         | str
                         | truee
                         | falsee
                         | cha
                         | LLAMADA
                         | self + ToTerm(".") + ATRIBUTO
                         | ATRIBUTO;

            TIPO.Rule = intt
                        | stringg
                        | charr
                        | booll
                        | doublee;
            TIPO2.Rule = TIPO
                         | id;

            #endregion

            #region Preferencias
            this.Root = S;
            this.NonGrammarTerminals.Add(comentarioLinea);
            this.NonGrammarTerminals.Add(comentarioBloque);
            this.MarkTransient(VALOR, PRIV, TIPO, TIPO2, SENTENCIA, CUERPO2, BLOQUE, CICLOS, CUERPO, PARAMETROS1, EA);
            this.RegisterOperators(2, Associativity.Left, mas, menos);
            this.RegisterOperators(3, Associativity.Left, por, division);
            this.RegisterOperators(4, Associativity.Left, poten);
            this.RegisterOperators(6, Associativity.Left, and);
            this.RegisterOperators(7, Associativity.Left, or);
            this.RegisterOperators(8, Associativity.Left, xor);
            this.RegisterOperators(9, Associativity.Left, not);
            this.RegisterOperators(10, Associativity.Left, iguali, distinto, mayor, menor, mayori, menori);
            this.MarkPunctuation(":", ".", "llamar", "hereda_de", "=", "Para", "X", "Si", "Sino", "Mientras", "Repetir", "until", "este", "metodo", "principal", "imprimir", ";", ",", "[", "]", "(", ")", "~", "{", "}", "void", "funcion", "clase", "si", "si_no_si", "si_no", "elegir", "caso", "defecto", "mientras", "para", "hacer", "repetir", "hasta", "loop");
            #endregion
        }
        public GramaticaTree()
            : base(caseSensitive: false)
        {
            #region expresiones regulares

            var doble  = new RegexBasedTerminal("doble", "[0-9]+[.][0-9]+");
            var entero = new RegexBasedTerminal("entero", "[0-9]+");

            var           identificador = TerminalFactory.CreateCSharpIdentifier("identificador");
            var           numero        = TerminalFactory.CreateCSharpNumber("numero");
            var           val_false     = Constantes.falso;
            var           val_true      = Constantes.verdadero;
            StringLiteral cadena        = new StringLiteral("cadena", "\"");
            var           caracter      = TerminalFactory.CreateCSharpChar(Constantes.caracter);

            CommentTerminal COMENT_BLOQUE = new CommentTerminal("COMENTARIO BLOQUE", "{--", "--}");
            CommentTerminal COMENT_LINEA  = new CommentTerminal("COMENTARIO LINEA", "##", "\n", "\r\n");
            NonGrammarTerminals.Add(COMENT_BLOQUE);
            NonGrammarTerminals.Add(COMENT_LINEA);

            #endregion


            #region declaracion de producciones
            NonTerminal
                VISIBILIDAD   = new NonTerminal(Constantes.visibilidad),
                TIPO          = new NonTerminal(Constantes.tipo),
                L_IDS         = new NonTerminal(Constantes.listaIds),
                DECLRACION    = new NonTerminal(Constantes.declaracion),
                ATRIBUTO      = new NonTerminal(Constantes.atributo),
                INSTRUCCION   = new NonTerminal(Constantes.instruccion),
                INSTRUCCIONES = new NonTerminal(Constantes.instrucciones),
                CUERPO        = new NonTerminal(Constantes.cuerpo),
                FUNCION       = new NonTerminal(Constantes.funcion),
                FUNCION_SOBRE = new NonTerminal(Constantes.funSobre),
                METODO        = new NonTerminal(Constantes.metodo),
                PARAMETRO     = new NonTerminal(Constantes.parametro),
                PARAMETROS    = new NonTerminal(Constantes.listaParametros),
                CONSTRUCTOR   = new NonTerminal(Constantes.constructor),
                ASIGNACION    = new NonTerminal(Constantes.asignacion),
                SI            = new NonTerminal(Constantes.si),
                SI_NO         = new NonTerminal(Constantes.sino),
                EXTRA         = new NonTerminal(Constantes.extraSi),
                L_EXTRAS      = new NonTerminal(Constantes.lextra),
                SALIR         = new NonTerminal(Constantes.salir),
                CONTINUAR     = new NonTerminal(Constantes.constructor),
                MIENTRAS      = new NonTerminal(Constantes.mientras),
                HACER         = new NonTerminal(Constantes.hacer),
                REPETIR       = new NonTerminal(Constantes.repetir),
                PARA          = new NonTerminal(Constantes.para),
                LOOP          = new NonTerminal(Constantes.loop),
                CASO          = new NonTerminal(Constantes.caso),
                DEFECTO       = new NonTerminal(Constantes.defecto),
                LISTACASOS    = new NonTerminal(Constantes.lcasos),
                ELEGIR        = new NonTerminal(Constantes.elegir),
                CUERPOELEGIR  = new NonTerminal(Constantes.cuerpoElegir),
                LLAMADA       = new NonTerminal(Constantes.llamada),
                INSTANCIA     = new NonTerminal(Constantes.instancia),
                LEXPRESIONES  = new NonTerminal(Constantes.lexpresiones),
                CLASE         = new NonTerminal(Constantes.clase);

            NonTerminal LISTACLASES  = new NonTerminal(Constantes.l_clases),
                        CUERPO_CLASE = new NonTerminal(Constantes.CUERPO_CLASE),
                        L_ELEMENTOS  = new NonTerminal(Constantes.listaElementos),
                        ELEMENTO     = new NonTerminal(Constantes.elementoClase);

            NonTerminal
                EXPRESION    = new NonTerminal(Constantes.expresion),
                ID           = new NonTerminal(Constantes.id),
                ENTERO       = new NonTerminal(Constantes.tipoEntero),
                DECIMAL      = new NonTerminal(Constantes.tipoDecimal),
                BOOL         = new NonTerminal(Constantes.tipoBool),
                CADENA       = new NonTerminal(Constantes.tipoCadena),
                TERMINO      = new NonTerminal(Constantes.termino),
                CHAR         = new NonTerminal(Constantes.tipoChar),
                POSICION     = new NonTerminal(Constantes.posicion),
                POSICIONES   = new NonTerminal(Constantes.lposiciones),
                OUT_STRING   = new NonTerminal(Constantes.imprimir),
                PARSEINT     = new NonTerminal(Constantes.parseint),
                PARSEDOUBLE  = new NonTerminal(Constantes.parsedouble),
                INTTOSTR     = new NonTerminal(Constantes.inttostr),
                DOUBLETOSTR  = new NonTerminal(Constantes.doubletostr),
                DOUBLETOINT  = new NonTerminal(Constantes.doubletoint),
                SUPER        = new NonTerminal(Constantes.super),
                SELF         = new NonTerminal(Constantes.self),
                DECLAARREGLO = new NonTerminal(Constantes.declaArreglo),
                ARITMETICA   = new NonTerminal(Constantes.aritmetica),
                LOGICA       = new NonTerminal(Constantes.logica),
                RELACIONAL   = new NonTerminal(Constantes.relacional);

            NonTerminal SUMA           = new NonTerminal(Constantes.suma);
            NonTerminal RESTA          = new NonTerminal(Constantes.resta);
            NonTerminal MULTIPLICACION = new NonTerminal(Constantes.multiplicacion);
            NonTerminal DIVISION       = new NonTerminal(Constantes.division);
            NonTerminal POTENCIA       = new NonTerminal(Constantes.potencia);
            NonTerminal MENOR          = new NonTerminal(Constantes.menor);
            NonTerminal MENORIGUAL     = new NonTerminal(Constantes.menorIgual);
            NonTerminal MAYOR          = new NonTerminal(Constantes.mayor);
            NonTerminal MAYORIGUAL     = new NonTerminal(Constantes.mayorIgual);
            NonTerminal IGUALIGUAL     = new NonTerminal(Constantes.igualIgual);
            NonTerminal DISTINTOA      = new NonTerminal(Constantes.distintoA);
            NonTerminal XOR            = new NonTerminal(Constantes.xorPython);
            NonTerminal AND            = new NonTerminal(Constantes.andPython);
            NonTerminal NOT            = new NonTerminal(Constantes.notJavaPython);
            NonTerminal OR             = new NonTerminal(Constantes.orPython);
            NonTerminal UNARIO         = new NonTerminal(Constantes.unario),
                        MAS_MAS        = new NonTerminal(Constantes.masmas),
                        MENOS_MENOS    = new NonTerminal(Constantes.menosmenos),
                        TIPOUNARIO     = new NonTerminal("TIPOU"),
                        NEGATIVO       = new NonTerminal(Constantes.negativo);


            NonTerminal RETORNO = new NonTerminal(Constantes.retorno);

            #endregion



            #region reglas semanticas

            VISIBILIDAD.Rule = ToTerm(Constantes.publico)
                               | ToTerm(Constantes.protegido)
                               | ToTerm(Constantes.privado);


            TIPO.Rule = ToTerm(Constantes.tipoBool)
                        | ToTerm(Constantes.tipoCadena)
                        | ToTerm(Constantes.tipoChar)
                        | ToTerm(Constantes.tipoDecimal)
                        | ToTerm(Constantes.tipoEntero)
                        | identificador;


            L_IDS.Rule = MakePlusRule(L_IDS, ToTerm(","), identificador);


            #region instrucciones clase

            ATRIBUTO.Rule = VISIBILIDAD + TIPO + L_IDS
                            | VISIBILIDAD + TIPO + DECLAARREGLO
                            | TIPO + L_IDS
                            | TIPO + DECLAARREGLO;

            PARAMETRO.Rule = TIPO + identificador;

            PARAMETROS.Rule = MakeStarRule(PARAMETROS, ToTerm(","), PARAMETRO);

            FUNCION.Rule = VISIBILIDAD + ToTerm(Constantes.metodo) + identificador + ToTerm("[") + PARAMETROS + "]" + ":" + Eos + CUERPO
                           | ToTerm(Constantes.metodo) + identificador + ToTerm("[") + PARAMETROS + "]" + ":" + Eos + CUERPO
                           | VISIBILIDAD + ToTerm(Constantes.funcion) + TIPO + identificador + "[" + PARAMETROS + "]" + ":" + Eos + CUERPO
                           | ToTerm(Constantes.funcion) + TIPO + identificador + "[" + PARAMETROS + "]" + ":" + Eos + CUERPO;

            FUNCION_SOBRE.Rule = ToTerm("/**Sobreescribir**/") + FUNCION;


            CONSTRUCTOR.Rule = ToTerm("__constructor") + "[" + PARAMETROS + "]" + ":" + Eos + CUERPO;



            LISTACLASES.Rule = MakePlusRule(LISTACLASES, CLASE);
            CLASE.Rule       = ToTerm(Constantes.clase) + identificador + "[" + identificador + "]" + ":" + Eos + CUERPO_CLASE
                               | ToTerm(Constantes.clase) + identificador + "[" + "]" + ":" + Eos + CUERPO_CLASE;


            CUERPO_CLASE.Rule = Indent + L_ELEMENTOS + Dedent;


            L_ELEMENTOS.Rule = MakeStarRule(L_ELEMENTOS, ELEMENTO);

            ELEMENTO.Rule = FUNCION
                            | ATRIBUTO + Eos
                            | CONSTRUCTOR
                            | FUNCION_SOBRE;



            #endregion



            #region instrucciones funcion


            CUERPO.Rule = Indent + INSTRUCCIONES + Dedent;

            INSTRUCCIONES.Rule = MakeStarRule(INSTRUCCIONES, INSTRUCCION);

            INSTRUCCION.Rule = DECLRACION + Eos   //
                               | ASIGNACION + Eos //--
                               | SI               //--
                               | SALIR + Eos
                               | CONTINUAR + Eos
                               | MIENTRAS        //--
                               | PARA            //--
                               | LOOP
                               | HACER           //--
                               | REPETIR         //--
                               | ELEGIR
                               | EXPRESION + Eos //--
                               | RETORNO + Eos;  //--


            DECLAARREGLO.Rule = identificador + POSICIONES;

            DECLRACION.Rule = TIPO + L_IDS
                              | TIPO + DECLAARREGLO;

            ASIGNACION.Rule = EXPRESION + ToTerm("=") + ">" + EXPRESION;


            #region estructuras de control

            SI.Rule = ToTerm(Constantes.si) + EXPRESION + ":" + Eos + CUERPO + L_EXTRAS + SI_NO
                      | ToTerm(Constantes.si) + EXPRESION + ":" + Eos + CUERPO + L_EXTRAS
                      | ToTerm(Constantes.si) + EXPRESION + ":" + Eos + CUERPO + SI_NO;

            RETORNO.Rule = ToTerm(Constantes.retorno) + EXPRESION;

            SI_NO.Rule = ToTerm(Constantes.sino_python) + ":" + Eos + CUERPO;

            EXTRA.Rule = ToTerm(Constantes.sino_si_python) + EXPRESION + ":" + Eos + CUERPO;

            L_EXTRAS.Rule = MakeStarRule(L_EXTRAS, EXTRA);


            SALIR.Rule     = ToTerm(Constantes.salir);
            CONTINUAR.Rule = ToTerm(Constantes.continuar);

            MIENTRAS.Rule = ToTerm(Constantes.mientras) + EXPRESION + ":" + Eos + CUERPO;

            HACER.Rule = ToTerm(Constantes.hacer) + ":" + Eos + CUERPO + Constantes.mientras + EXPRESION + Eos;

            REPETIR.Rule = ToTerm(Constantes.repetir) + ":" + Eos + CUERPO + Constantes.hasta + EXPRESION + Eos;

            PARA.Rule = ToTerm(Constantes.para) + "[" + ASIGNACION + ":" + EXPRESION + ":" + EXPRESION + "]" + ":" + Eos + CUERPO;

            LOOP.Rule = ToTerm(Constantes.loop) + ":" + Eos + CUERPO;

            CASO.Rule = EXPRESION + ToTerm(":") + Eos + CUERPO;

            DEFECTO.Rule = ToTerm(Constantes.defecto) + ":" + Eos + CUERPO;

            LISTACASOS.Rule = MakeStarRule(LISTACASOS, CASO);

            CUERPOELEGIR.Rule = Indent + LISTACASOS + DEFECTO + Dedent
                                | Indent + LISTACASOS + Dedent
                                | Indent + DEFECTO + Dedent;

            ELEGIR.Rule = ToTerm(Constantes.elegir) + EXPRESION + ":" + Eos + CUERPOELEGIR;



            #endregion



            #endregion


            #region expresion

            LEXPRESIONES.Rule = MakeStarRule(LEXPRESIONES, ToTerm(","), EXPRESION);

            LLAMADA.Rule = identificador + ToTerm("[") + LEXPRESIONES + "]"
                           | identificador + ToTerm("[") + "]";

            INSTANCIA.Rule = ToTerm(Constantes.nuevoPython) + identificador + ToTerm("[") + LEXPRESIONES + "]"
                             | ToTerm(Constantes.nuevoPython) + identificador + ToTerm("[") + "]";



            OUT_STRING.Rule  = ToTerm(Constantes.out_string) + "[" + EXPRESION + "]";
            PARSEINT.Rule    = ToTerm(Constantes.parseint) + "[" + EXPRESION + "]";
            PARSEDOUBLE.Rule = ToTerm(Constantes.parsedouble) + "[" + EXPRESION + "]";
            INTTOSTR.Rule    = ToTerm(Constantes.inttostr) + "[" + EXPRESION + "]";
            DOUBLETOSTR.Rule = ToTerm(Constantes.doubletostr) + "[" + EXPRESION + "]";
            DOUBLETOINT.Rule = ToTerm(Constantes.doubletoint) + "[" + EXPRESION + "]";


            POSICION.Rule = ToTerm("[") + EXPRESION + "]";

            POSICIONES.Rule = MakePlusRule(POSICIONES, POSICION);
            SUPER.Rule      = ToTerm(Constantes.super);
            SELF.Rule       = ToTerm(Constantes.self);

            ID.Rule      = identificador;
            ENTERO.Rule  = entero;
            DECIMAL.Rule = doble;

            CADENA.Rule = cadena;
            CHAR.Rule   = caracter;
            BOOL.Rule   = ToTerm(val_true)
                          | ToTerm(val_false);


            ARITMETICA.Rule = SUMA
                              | RESTA
                              | MULTIPLICACION
                              | DIVISION
                              | POTENCIA;

            RELACIONAL.Rule = MENOR
                              | MAYOR
                              | MENORIGUAL
                              | MAYORIGUAL
                              | DISTINTOA
                              | IGUALIGUAL;

            LOGICA.Rule = XOR
                          | OR
                          | AND
                          | NOT;



            SUMA.Rule           = TERMINO + TERMINO + ToTerm(Constantes.suma);
            RESTA.Rule          = TERMINO + TERMINO + ToTerm(Constantes.resta);
            MULTIPLICACION.Rule = TERMINO + TERMINO + ToTerm(Constantes.multiplicacion);
            DIVISION.Rule       = TERMINO + TERMINO + ToTerm(Constantes.division);
            POTENCIA.Rule       = TERMINO + TERMINO + ToTerm(Constantes.potencia);
            MENOR.Rule          = TERMINO + TERMINO + ToTerm(Constantes.menor);
            MENORIGUAL.Rule     = TERMINO + TERMINO + ToTerm(Constantes.menorIgual);
            MAYOR.Rule          = TERMINO + TERMINO + ToTerm(Constantes.mayor);
            MAYORIGUAL.Rule     = TERMINO + TERMINO + ToTerm(Constantes.mayorIgual);
            IGUALIGUAL.Rule     = TERMINO + TERMINO + ToTerm(Constantes.igualIgual);
            DISTINTOA.Rule      = TERMINO + TERMINO + ToTerm(Constantes.distintoA);
            XOR.Rule            = TERMINO + TERMINO + ToTerm(Constantes.xorJava);
            AND.Rule            = TERMINO + TERMINO + ToTerm(Constantes.andJava);
            NOT.Rule            = TERMINO + ToTerm(Constantes.notJavaPython);
            OR.Rule             = TERMINO + TERMINO + ToTerm(Constantes.orJava);

            TIPOUNARIO.Rule = CHAR
                              | DECIMAL
                              | ENTERO;

            UNARIO.Rule = MAS_MAS
                          | MENOS_MENOS;

            MAS_MAS.Rule = TIPOUNARIO + ToTerm(Constantes.masmas);

            MENOS_MENOS.Rule = TIPOUNARIO + ToTerm(Constantes.menosmenos);


            NEGATIVO.Rule = ToTerm("-") + TERMINO;



            TERMINO.Rule = ID
                           | ENTERO
                           | DECIMAL
                           | CADENA
                           | CHAR
                           | BOOL
                           | OUT_STRING
                           | PARSEINT
                           | PARSEDOUBLE
                           | INTTOSTR
                           | DOUBLETOSTR
                           | DOUBLETOINT
                           | INSTANCIA
                           | LLAMADA
                           | SUPER
                           | SELF
                           | DECLAARREGLO
                           | ToTerm("(") + ARITMETICA + ")"
                           | ToTerm("[") + RELACIONAL + "]"
                           | ToTerm("{") + LOGICA + "}"
                           | UNARIO
                           | NEGATIVO;



            EXPRESION.Rule = MakePlusRule(EXPRESION, ToTerm("."), TERMINO);



            #endregion

            #endregion
            NonTerminal h = new NonTerminal("e");
            h.Rule = TERMINO + Eos;


            this.Root = LISTACLASES;


            MarkPunctuation(Constantes.out_string, Constantes.orPython, Constantes.andPython, Constantes.xorPython, Constantes.notJavaPython, "+", "-", "*", "/", "^", "(", ")", ";", "=", "@", "{", "}", "clase", "[", "]", Constantes.nuevoPython, ".", "si", "sino",
                            "mientras", "hacer", "para", "x", "repetir", "return", "imprimir", Constantes.masmas, Constantes.menosmenos,
                            Constantes.menor, Constantes.mayor, Constantes.menorIgual, Constantes.mayorIgual, Constantes.igualIgual, Constantes.distintoA,
                            Constantes.orPython, Constantes.andPython, Constantes.xorPython, Constantes.notJavaPython, "__constructor", Constantes.metodo, Constantes.funcion,

                            Constantes.out_string, Constantes.loop,
                            Constantes.parseint,
                            Constantes.parsedouble,
                            Constantes.inttostr,
                            Constantes.doubletostr,
                            Constantes.doubletoint, Constantes.super, Constantes.self, "/**Sobreescribir**/", ":", Constantes.sino_python, Constantes.sino_si_python

                            );



            MarkTransient(L_ELEMENTOS, ELEMENTO, POSICION, TIPOUNARIO, INSTRUCCION, INSTRUCCIONES,
                          ARITMETICA, LOGICA, RELACIONAL, UNARIO, INSTRUCCIONES, TERMINO, CUERPO_CLASE, h);
        }