def p_asignaciones(t): '''ASIGNACIONES : INCRE_DECRE PUNTOCOMA | ID OP_ASIGNACION EXPRESION PUNTOCOMA | ID CORCHETES OP_ASIGNACION EXPRESION PUNTOCOMA''' global grammarList if len(t) == 6: #asignacion de valor a arreglo; a = 3 t[0] = AsignationArray(t[1], t[2], t[4], t.lineno(1), t.lexpos(1)) grammarList.append( g.nodeGramatical( 'ASIGNACIONES -> ID CORCHETES OP_ASIGNACION EXPRESION PUNTOCOMA', f'ASIGNACIONES.val= AsignationArray(t[1], t[2], t[4], t.lineno(1), t.lexpos(1))' )) elif len(t) == 5: #ID OP_ASIGNACION EXPRESION PUNTOCOMA t[0] = Asignation(t[1], t[2], t[3], t.lineno(1), t.lexpos(3)) grammarList.append( g.nodeGramatical( 'ASIGNACIONES -> ID OP_ASIGNACION EXPRESION PUNTOCOMA ', f'ASIGNACIONES.val= Asignation(t[1], t[2], t[3], t.lineno(1), t.lexpos(3))' )) elif len(t) == 3: #incremento o decremento t[0] = t[1] t[0] = Asignation(t[1].id, '=', t[1], t.lineno(2), t.lexpos(2))
def p_elseIf_(t): ''' ELSE_IF_ : ELSE_IF | ELSE_ | ELSE_IF ELSE_ | ''' global grammarList if len(t) == 2: t[1] = flatten(t[1]) t[0] = t[1] grammarList.append( g.nodeGramatical('ELSE_IF_ -> ELSE_IF \n | ELSE_', f't[1] = flatten(t[1]) \n ELSE_IF_.val = t[1]')) elif len(t) == 3: t[1].append(t[2]) t[1] = flatten(t[1]) t[0] = t[1] grammarList.append( g.nodeGramatical( 'ELSE_IF_ -> ELSE_IF ELSE_', f't[1].append(t[2]) \n t[1] = flatten(t[1]) \n ELSE_IF_.val = t[1]' )) else: t[0] = [] grammarList.append( g.nodeGramatical('ELSE_IF_ -> ', f'ELSE_IF_.val = []'))
def p_declaracionStructInterna(t): '''DECLARACION_STRUCT_INTERNA : STRUCT ID ASISTRCUT PUNTOCOMA | ID ASISTRCUT PUNTOCOMA | ASISTRCUT IGUAL EXPRESION PUNTOCOMA | ASISTRCUT LISTA_PUNTOS OP_ASIGNACION EXPRESION PUNTOCOMA ''' global grammarList if len(t) == 5 and t[1] == 'struct': #STRUCT ID ASISTRCUT PUNTOCOMA t[0] = DeclaStructIntr(t[2], t[3], t.lineno(1), t.lexpos(1)) grammarList.append( g.nodeGramatical( 'DECLARACION_STRUCT_INTERNA -> STRUCT ID ASISTRCUT PUNTOCOMA ', f'DECLARACION_STRUCT_INTERNA.val= AsignationStruct(t[2], t[3], t.lineno(1), t.lexpos(1))' )) elif len(t) == 6: #ASISTRCUT ID IGUAL EXPRESION PUNTOCOMA a = 3 t[0] = AsignationStructExpre(t[1], t[2], t[4], t.lineno(5), t.lexpos(5)) grammarList.append( g.nodeGramatical( 'DECLARACION_STRUCT_INTERNA -> ASISTRCUT LISTA_PUNTOS OP_ASIGNACION EXPRESION PUNTOCOMA ', f'DECLARACION_STRUCT_INTERNA.val= AsignationStructExpre(t[1], t[2], t[4], t.lineno(6), t.lexpos(6))' ))
def p_instrucciones(t): '''INSTRUCCIONES : PRINT PARIZQ EXPRESION PARDER PUNTOCOMA | IF PARIZQ EXPRESION PARDER GOTO LABEL PUNTOCOMA | UNSET PARIZQ ID PARDER PUNTOCOMA | EXIT PUNTOCOMA | GOTO LABEL PUNTOCOMA''' global contador, conNode, fgraph, senteList, input_, grammarList, lisInstructions if (t[1] == 'print'): t[0] = Print_(t[3], t.lineno(2), find_column(input_, t.slice[2])) grammarList.append( g.nodeGramatical('INSTRUCCIONES -> PRINT ( EXPRESION ) PUNTOCOMA', f'INSTRUCCIONES.val = Print_(EXPRESION.val')) elif (t[1] == 'if'): t[0] = If(t[3], t[6], t.lineno(2), find_column(input_, t.slice[2])) grammarList.append( g.nodeGramatical( 'INSTRUCCIONES -> IF ( EXPRESION ) GOTO LABEL PUNTOCOMA', f'INSTRUCCIONES.val = If(EXPRESION.val, LABEL.value')) elif (t[1] == 'unset'): t[0] = Unset(t[3], t.lineno(3), t.lexpos(3)) grammarList.append( g.nodeGramatical('INSTRUCCIONES -> UNSET ( ID ) PUNTOCOMA', f'INSTRUCCIONES.val = Unset(ID.value)')) elif (t[1] == 'goto'): t[0] = Goto(t[2]) grammarList.append( g.nodeGramatical('INSTRUCCIONES -> GOTO LABEL PUNTOCOMA', f'INSTRUCCIONES.val = Goto(LABEL.value)')) elif (t[1] == 'exit'): t[0] = Exit() grammarList.append( g.nodeGramatical('INSTRUCCIONES -> EXIT PUNTOCOMA', f'INSTRUCCIONES.val = Exit( )'))
def p_funcion(t): '''FUNCION : ABS PARIZQ EXPRESION PARDER | READ PARIZQ PARDER | PARIZQ TIPO PARDER ID | ARRAY PARIZQ PARDER''' global contador, conNode, fgraph, grammarList, lisInstructions if (t[1] == 'abs'): t[0] = Abs(t[3], t.lineno(3), t.lexpos(3)) grammarList.append( (g.nodeGramatical('FUNCION -> ABS ( EXPRESION )', f'FUNCION.val = Abs(EXPRESION.val)'))) elif (t[1] == 'read'): t[0] = ReadConsole(t.lineno(1), t.lexpos(1)) grammarList.append((g.nodeGramatical('FUNCION -> READ ( )', f'FUNCION.val = ReadConsole( )'))) elif (t[1] == '('): t[0] = Cast_(Identifier(t[4], t.lineno(4), t.lexpos(4)), t[2], t.lineno(2), t.lexpos(2)) grammarList.append((g.nodeGramatical( 'FUNCION -> ( TIPO )', f'FUNCION.val = Cast_(Identifier({t[4]}),{t[2]})'))) elif (t[1] == 'array'): t[0] = t[1] #devolvemos la palabra array grammarList.append((g.nodeGramatical('FUNCION -> ARRAY ( )', f'FUNCION.val = \'array\'')))
def p_punt(t): '''PUNT : ID ID | ID ''' global grammarList if len(t) == 3: grammarList.append( g.nodeGramatical('PUNT -> ID ID ', f' PUNT.val= Ids(t[1],t[2])')) else: t[0] = t[1] grammarList.append( g.nodeGramatical('PUNT -> ID ', f' PUNT.val= ID.value'))
def p_default(t): '''DEFAULT_ : DEFAULT DOSPUNTOS INSTRUCCIONES_INTERNAS | ''' global grammarList if len(t) == 4: t[0] = Default_(t[3], 0, t.lineno(1), t.lexpos(1)) grammarList.append( g.nodeGramatical('DEFAULT_ -> empty', f'DEFAULT_.val = []')) else: t[0] = [] grammarList.append( g.nodeGramatical('DEFAULT_ -> empty', f'DEFAULT_.val = []'))
def p_asignaStructInterna(t): '''ASISTRCUT : ID CORCHETES | ID ''' global grammarList if len(t) == 3: t[0] = IdentifierArray(t[1], t[2], t.lineno(1), t.lexpos(1)) grammarList.append( g.nodeGramatical('ASISTRCUT -> ID CORCHETES ', f'ASISTRCUT.val= IdentifyArray(t[1],t[2])')) else: t[0] = Identifier(t[1], t.lineno(1), t.lexpos(1)) grammarList.append( g.nodeGramatical('ASISTRCUT -> ID ', f'ASISTRCUT.val= ID.value)'))
def p_llamadaFuncion(t): '''LLAMADA_FUNCION : ID PARIZQ PARAMETROS PARDER | ID PARIZQ PARDER''' global grammarList if len(t) == 5: t[0] = CallFunction(t[1], t[3], t.lineno(2), t.lexpos(2)) grammarList.append( g.nodeGramatical( 'LLAMADA_FUNCION -> LLAVEIZQ PARAMETROS LLAVEDER ', f' LLAMADA_FUNCION.val= Call(t[1], t[3])')) else: t[0] = CallFunction(t[1], [], t.lineno(2), t.lexpos(2)) grammarList.append( g.nodeGramatical('LLAMADA_FUNCION -> ID PARIZQ PARDER ', f' LLAMADA_FUNCION.val= Call(t[1], [])'))
def p_break(t): '''BREAK_ : BREAK | ''' #print("estoy entrando en break") global grammarList if len(t) == 2: t[0] = 1 grammarList.append( g.nodeGramatical('BREAK_ -> BREAK', f'BREAK_.val = [BREAK.val]')) else: t[0] = 0 grammarList.append( g.nodeGramatical('BREAK_ -> empty', f'BREAK_.val = []'))
def p_expresiones_listaCorchetesInit(t): '''EXPRESION : LISTA_INIT_CORCHETE''' t[0] = t[1] global grammarList grammarList.append( g.nodeGramatical('EXPRESION -> LISTA_INIT_CORCHETE ', f' EXPRESION.val= LISTA_INIT_CORCHETE.val'))
def p_valor(t): 'VALOR : EXPRESION' t[0] = t[1] global grammarList grammarList.append( g.nodeGramatical('VALOR -> EXPRESION ', f' VALOR.val= EXPRESION.val'))
def p_instruccionesGlobal(t): 'A : INSTRUCCIONES_GLOBALES' t[0] = t[1] global grammarList grammarList.append( g.nodeGramatical('A -> INSTRUCCIONES_GLOBALES', f'A.val = INSTRUCCIONES_GLOBALES.val'))
def p_init(t): 'S : A' t[0] = t[1] print("Se ha reconocido la cadena.") global grammarList grammarList.append(g.nodeGramatical('S -> A', f'S.val = A.val')) grammarList.reverse()
def p_atr(t): '''ATR : DECLA_VARIABLES''' t[0] = t[1] global grammarList grammarList.append( g.nodeGramatical('ATR -> DECLA_VARIABLES', f'ATR.val = DECLA_VARIABLES.val'))
def p_sentencias__empty(t): 'SENTENCIAS_ : ' t[0] = empty() global grammarList grammarList.append( g.nodeGramatical('SENTENCIAS_ -> epsilon ', f'SENTENCIAS_.val = empty()'))
def p_recepcionParametrosEmpty(t): 'RECEPCION_PARAMETROS : ' t[0] = [] global grammarList grammarList.append( g.nodeGramatical('RECEPCION_PARAMETROS -> empty ', f' RECEPCION_PARAMETROS.val= []'))
def p_init(t): 'S : A' #code (sintetize result the A to S) t[0] = t[1] #region graph global fgraph, senteList, contador, conNode fgraph.write("n00" + str(conNode + 1) + " [label=\"A\"] ;\n") for i in senteList: fgraph.write("n00" + str(conNode + 1) + " -- " + "n00" + str(i) + ";\n") senteList[:] = [] contador += 1 fgraph.write("n00" + str(conNode + 2) + " [label=\"S\"] ;\n") fgraph.write("n00" + str(conNode + 2) + " -- " + "n00" + str(conNode + 1) + ";\n") conNode += 3 #endregion fgraph.flush() fgraph.close() global grammarList grammarList.append(g.nodeGramatical('S -> A', f'S.val = A.val')) grammarList.reverse() global lisInstructions tmp = flatten(lisInstructions) lisInstructions = tmp[:]
def p_expresion_ope(t): 'EXPRESION : OPERACION' t[0] = t[1] global grammarList grammarList.append( g.nodeGramatical('EXPRESION -> OPERACION', f'EXPRESION.val = OPERACION.val'))
def p_expresion_ato(t): 'EXPRESION : ATOMICO' t[0] = t[1] global grammarList grammarList.append( g.nodeGramatical('EXPRESION -> ATOMICO', f'EXPRESION.val = ATOMICO.val'))
def p_expresion_fun(t): 'EXPRESION : FUNCION' t[0] = t[1] global grammarList grammarList.append( g.nodeGramatical('EXPRESION -> FUNCION', f'EXPRESION.val = FUNCION.val'))
def p_corchete(t): 'CORCHETE : CORIZQ F CORDER' t[0] = t[2] global grammarList grammarList.append( g.nodeGramatical('CORCHETE -> CORQIZQ F CORDER', f'CORCHETE.val = F.val'))
def p_f_idARRAY(t): 'F : ID CORCHETES' global grammarList grammarList.append( (g.nodeGramatical('F -> ID CORCHETES', f'F.val = IdentifierArray(ID.value,CORCHETES.val)'))) t[0] = IdentifierArray(t[1], t[2], t.lineno(1), find_column(input_, t.slice[1]))
def p_instruccionesInternas(t): '''INSTRUCCIONES_INTERNAS : INSTRUCCIONES_INTERNAS INSTR_IN | INSTR_IN''' global grammarList if len(t) == 3: t[1].append(t[2]) t[0] = t[1] grammarList.append( g.nodeGramatical( 'INSTRUCCIONES_INTERNAS -> INSTRUCCIONES_INTERNAS INSTR_IN ', f' INSTRUCCIONES_INTERNAS_1.val.append(INSTR_IN.val) \n INSTRUCCIONES_INTERNAS.val= INSTRUCCIONES_INTERNAS_1.val' )) else: t[0] = [t[1]] grammarList.append( g.nodeGramatical('INSTRUCCIONES_INTERNAS -> INSTR_IN ', f'INSTRUCCIONES_INTERNAS.val= INSTR_IN.val'))
def p_array(t): '''ARRAY_ : CORCHETES IGUAL EXPRESION PUNTOCOMA | IGUAL EXPRESION PUNTOCOMA''' global grammarList if (t[1] == '='): t[0] = t[2] #if expresion is array, expression contain 'array' grammarList.append( g.nodeGramatical('ARRAY_ -> IGUAL EXPRESION PUNTOCOMA', f'ARRAY_.val = EXPRESION.val')) else: t[0] = ExpressionsDeclarationArray(t[1], t[3], t.lineno(2), find_column(input_, t.slice[2])) grammarList.append( g.nodeGramatical( 'ARRAY_ -> CORCHETES IGUAL EXPRESION PUNTOCOMA', f'ARRAY_.val = ExpresionDeclarationArray(CORCHETES.val, EXPRESION.val)' ))
def p_declaraciones(t): 'DECLARACIONES : ID ARRAY_' t[0] = Declaration(t[1], t.lineno(1), t.lexpos(1), t[2]) global grammarList grammarList.append( g.nodeGramatical( 'DECLARACIONES -> ID ARRAY', f'DECLARACIONES.val = Declaration(ID.value,ARRAY_.val'))
def p_sentencia_eti(t): 'SENTENCIA : ETIQUETA' t[0] = t[1] global grammarList grammarList.append( g.nodeGramatical('SENTENCIA -> ETIQUETA', f'SENTENCIA.val = ETIQUETA.val'))
def p_etiqueta(t): # i call label to recognize the label 'ETIQUETA : LABEL DOSPUNTOS' t[0] = Label(t[1], t.lineno(1), find_column(input_, t.slice[1])) global grammarList grammarList.append( g.nodeGramatical('ETIQUETA -> LABEL DOSPUNTOS', f'ETIQUETA.val = Label(LABEL.value)'))
def p_sentencia_decla(t): 'SENTENCIA : DECLARACIONES' t[0] = t[1] global grammarList grammarList.append( g.nodeGramatical('SENTENCIA -> DECLARACIONES', f'SENTENCIA.val = DECLARACIONES.val'))
def p_sentencia_instr(t): 'SENTENCIA : INSTRUCCIONES' t[0] = t[1] global grammarList grammarList.append( g.nodeGramatical('SENTENCIA -> INSTRUCCIONES', f'SENTENCIA.val = INSTRUCCIONES.val'))