Exemple #1
0
/* <identificador> → #leer_id {, <identificador> #leer_id} */
void lista_identificadores(void) {
	
	struct reg_expr id_reg;
	
	identificador(&id_reg);
	leer_id(&id_reg);
	while(prox_token() == COMA) {
		match(COMA);
		identificador(&id_reg);
		leer_id(&id_reg);
	}
}
Exemple #2
0
/*
 *	<sentencia> →
 *	<identificador> := <expresión> #asignar ;  |
 *	leer ( <listaIdentificadores> ) ; |
 *	escribir ( <listaExpresiones> ) ;
 */
void sentencia(void) {
	token tok = prox_token();
	struct reg_expr id_reg, result_reg;
	
	switch(tok) {
		case ID:
			identificador(&id_reg);
			match(ASIGNACION);
			expresion(&result_reg);
			asignar(&id_reg, &result_reg);
			match(PUNTOYCOMA);
			break;
		case LEER:
			match(LEER);
			match(PARENIZQUIERDO);
			lista_identificadores();
			match(PARENDERECHO);
			match(PUNTOYCOMA);
			break;
		case ESCRIBIR:
			match(ESCRIBIR);
			match(PARENIZQUIERDO);
			lista_expresiones();
			match(PARENDERECHO);
			match(PUNTOYCOMA);
			break;
		default:
			error_sintactico(tok);
			return;
	}
}
Exemple #3
0
void primaria(reg_expr * reg) {
    /* <primaria> -> <identificador>
	 *             | CONSTANTE
	 *             | PARENIZQUIERDO <expresión> PARENDERECHO
	 */
	token tok = next_token();
	switch (tok) {
		case ID:
			identificador(reg);
			break;

		case CONSTANTE:
			match(CONSTANTE);
			*reg = procesar_cte(); // #procesar_cte
			break;

		case PARENIZQUIERDO:
			match(PARENIZQUIERDO);
			expresion(reg);
			match(PARENDERECHO);
			break;

		default:
			syntax_error(tok, "PRIMARIA");
	}
}
Exemple #4
0
void lista_identificadores(void){
	// <listaIdentificadores> -> <identificador> {COMA <identificador>}
	reg_expr id;
    do {
        identificador(&id);
        leer_id(&id); // #leer_id
    } while(next_token() == COMA && (match(COMA), true));
}
Exemple #5
0
type lexico(){   
    
    while(esp_blanco());

    if(identificador()) return _id;
    else if(naturales()) return _nat;
    else if(octal()) return _oct;
    else if(eof()) return _eof;
    else if (hexadecimal()) return _hex;
    else if (parent_izq()) return _parent_izq;

    return _error;
}
Exemple #6
0
/*
 *	<primaria> →
 *	<identificador> |
 *	CONSTANTE #procesar_cte |
 * 	(<expresión>)
 */	
void primaria(struct reg_expr *preg) {
	token tok;
	
	tok = prox_token();
	switch (tok) {
		case ID:
			identificador(preg);
			break;
		case CONSTANTE:
			match(CONSTANTE);
			*preg = procesar_cte();
			break;
		case PARENIZQUIERDO:
			match(PARENIZQUIERDO);
			expresion(preg);
			match(PARENDERECHO);
			break;
		default:
			error_sintactico(tok);
			return;
	}
}
Exemple #7
0
void sentencia(void) {
    /*
	 * <sentencia> -> <identificador> ASIGNACION <expresión> PUNTOYCOMA
	 *              | LEER PARENIZQUIERDO <listaIdentificadores> PARENDERECHO PUNTOYCOMA
	 *              | ESCRIBIR PARENIZQUIERDO <listaExpresiones> PARENDERECHO PUNTOYCOMA
	 */
	token tok = next_token();
	reg_expr right_operand, left_operand;
	switch (tok) {
            
		case ID:
			identificador(&left_operand);
			match(ASIGNACION);
			expresion(&right_operand);
			asignar(&left_operand, &right_operand); // #asignar
			match(PUNTOYCOMA);
			break;

		case LEER:
			match(LEER);
			match(PARENIZQUIERDO);
			lista_identificadores();
			match(PARENDERECHO);
			match(PUNTOYCOMA);
			break;

		case ESCRIBIR:
			match(ESCRIBIR);
			match(PARENIZQUIERDO);
			lista_expresiones();
			match(PARENDERECHO);
			match(PUNTOYCOMA);
			break;

		default:
			syntax_error(tok, "SENTENCIA");
	}
}